是否可以定义在CAST
操作失败时返回的默认值?
例如,以便:
SELECT CAST('foo' AS INTEGER)
是否会返回默认值而不是抛出错误?
答案 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的封闭块捕获,或者如果没有,则中止处理函数。