Postgres:定义CAST失败的默认值?

时间:2012-04-24 22:17:02

标签: sql postgresql

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

例如,以便:

SELECT CAST('foo' AS INTEGER)

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

2 个答案:

答案 0 :(得分:25)

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 your own casts,所以你可以做这样的事情:

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的{​​{1}}值,这些值不是有效整数。如果您想使用此自动默认转换来转换some_text_column,那么您必须进行双重投射:

varchar

仅仅因为你能做到这一点并不是一个好主意。我不认为将标准文本替换为整数转换是最好的想法。上述方法还要求您单独保留标准select cast(some_varchar::text as integer) from t varchar,如果您想自己完成整个转换,而不是懒洋洋地投入内置投射,则可以解决这个问题。

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

答案 1 :(得分:2)

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

下面包含

Documentation on error trapping for PostgreSQL代码段。

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的封闭块捕获,或者如果没有,则中止处理函数。