是否可以定义在CAST操作失败时将返回的默认值?
CAST
例如,这样:
SELECT CAST('foo' AS INTEGER)
将返回默认值而不是抛出错误吗?
CAST没有默认值:
类型转换指定从一种数据类型到另一种数据类型的转换。PostgreSQL接受两种等效的类型转换语法: CAST ( expression AS type ) expression::type
类型转换指定从一种数据类型到另一种数据类型的转换。PostgreSQL接受两种等效的类型转换语法:
CAST ( expression AS type ) expression::type
除了要转换的表达式和所需的目标类型以外,语法中没有余地。
但是,您可以通过简单的功能手动完成此操作:
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;
然后,您可以说出类似的话cast_to_int('pancakes', 0)并得到0。
cast_to_int('pancakes', 0)
0
PostgreSQL还允许您创建自己的演员表,因此您可以执行以下操作:
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);
那你可以说
select cast('pancakes'::text as integer)
得到0或者你可以说
select cast(some_text_column as integer) from t
并获取不是有效整数0的some_text_column值。如果您想varchar使用此自动默认转换强制转换s,则必须进行双重转换:
some_text_column
varchar
select cast(some_varchar::text as integer) from t
仅仅因为您可以做到这一点,就不是一个好主意。我不认为将标准文本替换为整数强制转换是最好的主意。上面的方法还要求您保留标准varchar以integer单独进行转换,如果您想自己进行整个转换而不是懒洋洋地打入内置转换,则可以避免这种情况。
integer
NULL处理是读者的一项(轻松)练习。