admin

Postgres:为CAST失败定义默认值吗?

sql

是否可以定义在CAST操作失败时将返回的默认值?

例如,这样:

SELECT CAST('foo' AS INTEGER)

将返回默认值而不是抛出错误吗?


阅读 186

收藏
2021-05-10

共1个答案

admin

CAST没有默认值:

类型转换指定从一种数据类型到另一种数据类型的转换。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

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

并获取不是有效整数0some_text_column值。如果您想varchar使用此自动默认转换强制转换s,则必须进行双重转换:

select cast(some_varchar::text as integer) from t

仅仅因为您可以做到这一点,就不是一个好主意。我不认为将标准文本替换为整数强制转换是最好的主意。上面的方法还要求您保留标准varcharinteger单独进行转换,如果您想自己进行整个转换而不是懒洋洋地打入内置转换,则可以避免这种情况。

NULL处理是读者的一项(轻松)练习。

2021-05-10