Không có giá trị mặc định cho CAST:
Kiểu ép kiểu chỉ định một chuyển đổi từ kiểu dữ liệu này sang kiểu dữ liệu khác. PostgreSQL chấp nhận hai cú pháp tương đương cho kiểu phôi:
CAST ( expression AS type ) expression::type
Không có chỗ trong cú pháp cho bất kỳ thứ gì khác ngoài biểu thức được truyền và kiểu đích mong muốn.
Tuy nhiên, bạn có thể làm điều đó bằng tay với một chức năng đơn giản:
create or replace function cast_to_int(text, integer) returns integer as $$
begin
return cast($1 as integer);
exception
when invalid_text_representation then
return $2;
end;
$$ language plpgsql immutable;
Sau đó, bạn có thể nói những thứ như cast_to_int('pancakes', 0)
và nhận 0
.
PostgreSQL cũng cho phép bạn tạo phôi của riêng mình để bạn có thể làm những việc như sau:
create or replace function cast_to_int(text) returns integer as $$
begin
-- Note the double casting to avoid infinite recursion.
return cast($1::varchar as integer);
exception
when invalid_text_representation then
return 0;
end;
$$ language plpgsql immutable;
create cast (text as integer) with function cast_to_int(text);
Sau đó, bạn có thể nói
select cast('pancakes'::text as integer)
và nhận 0
hoặc bạn có thể nói
select cast(some_text_column as integer) from t
và nhận 0
cho some_text_column
giá trị không phải là số nguyên hợp lệ. Nếu bạn muốn truyền varchar
bằng cách sử dụng kiểu truyền mặc định tự động này thì bạn phải truyền hai lần:
select cast(some_varchar::text as integer) from t
Chỉ vì bạn có thể làm được điều này không phải là một ý tưởng hay. Tôi không nghĩ rằng việc thay thế văn bản tiêu chuẩn thành kiểu ép số nguyên là ý tưởng tốt nhất từ trước đến nay. Cách tiếp cận trên cũng yêu cầu bạn để lại varchar
tiêu chuẩn thành integer
truyền một mình, bạn có thể giải quyết vấn đề đó nếu bạn muốn tự mình thực hiện toàn bộ quá trình chuyển đổi thay vì lười biếng chuyển sang tính năng truyền được xây dựng sẵn.
Xử lý NULL được để lại như một bài tập (dễ) cho người đọc.