28

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

例如,这样:

SELECT CAST('foo' AS INTEGER)

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

4

2 回答 2

39

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)和 get之类的东西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 ,那么您必须双重转换:

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

仅仅因为你能做到这一点并不意味着它是一个好主意。我不认为将标准文本替换为整数转换是有史以来最好的主意。上述方法还要求您将标准单独varchar进行integer转换,如果您想自己进行整个转换而不是懒惰地使用内置转换,您可以绕过这个问题。

NULL 处理留给读者作为一个(简单的)练习。

于 2012-04-24T23:32:38.067 回答
3

按照文档中的描述捕获错误,然后指定要执行的操作。

下面包含有关 PostgreSQL Snippet 错误捕获的文档。

35.7.5。捕获错误

默认情况下,PL/pgSQL 函数中发生的任何错误都会中止函数的执行,实际上也中止周围事务的执行。您可以使用带有 EXCEPTION 子句的 BEGIN 块捕获错误并从中恢复。该语法是 BEGIN 块的正常语法的扩展:

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
EXCEPTION
    WHEN condition [ OR condition ... ] THEN
        handler_statements
    [ WHEN condition [ OR condition ... ] THEN
          handler_statements
      ... ]
END;

如果没有发生错误,这种形式的块简单地执行所有语句,然后控制传递到 END 之后的下一条语句。但是,如果语句中发生错误,则放弃对语句的进一步处理,并将控制传递给 EXCEPTION 列表。在列表中搜索与发生的错误匹配的第一个条件。如果找到匹配项,则执行相应的 handler_statements,然后控制权传递到 END 之后的下一条语句。如果没有找到匹配项,错误就会传播出去,就好像 EXCEPTION 子句根本不存在一样:错误可以被带有 EXCEPTION 的封闭块捕获,或者如果没有,则中止函数的处理。

于 2012-04-24T22:53:35.523 回答