是否可以定义一个在CAST
操作失败时返回的默认值?
例如,这样:
SELECT CAST('foo' AS INTEGER)
会返回默认值而不是抛出错误吗?
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 处理留给读者作为一个(简单的)练习。
按照文档中的描述捕获错误,然后指定要执行的操作。
下面包含有关 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 的封闭块捕获,或者如果没有,则中止函数的处理。