尝试在 Postgres 中捕获等效项
Posted
技术标签:
【中文标题】尝试在 Postgres 中捕获等效项【英文标题】:Try catch equivalent in Postgres 【发布时间】:2019-11-25 17:53:20 【问题描述】:我需要清除(删除特殊字符)并将文本转换为数字。 但是,如果无法执行转换,我需要将错误保存在变量中,以便稍后与其他错误一起插入到表的元组中。
CREATE OR REPLACE FUNCTION TEST(V1 TEXT, OUT ERRO TEXT)
RETURNS TEXT
LANGUAGE plpgsql
AS
$$
DECLARE
V2 NUMERIC;
MSG TEXT;
BEGIN
--"TRY"
V2 := REPLACE(REGEXP_REPLACE(V1, '[^,.0-9]+', '', 'g'),',','.');
--"CATCH"
MSG = 'CONVERSION FAILED';
SELECT MSG INTO ERRO;
END;
$$;
SELECT * FROM TEST('65,^%F,5');
--EXPECTED: 'CONVERSION FAILED'
SELECT * FROM TEST('65^%F,5');
--EXPECTED: 65.5
【问题讨论】:
PostgreSQL Exception Handling的可能重复%F
发生了什么?您对模式不匹配的失败转换的定义是什么?
'%F' 这些只是字符串中的特殊字符。正则表达式删除它们..
【参考方案1】:
Try...Catch 在 Postgres 中实现为带有异常处理的代码块。对于这种情况,我们遇到的错误可以将正则表达式的结果字符串转换为数值。下面进行转换,他们将其转换回字符串以匹配返回值。
create or replace function test(v1 text)
returns text
language plpgsql
as
$$
declare
erro text ;
begin
begin -- try
erro:= (replace(regexp_replace(v1, '[^,.0-9]+', '', 'g'),',','.')::numeric)::text;
exception -- catch
when invalid_text_representation then -- error that can be handeled
erro = 'CONVERSION FAILED';
end ; -- try..catch
return erro;
end;
$$;
【讨论】:
谢谢!这就是我需要的!以上是关于尝试在 Postgres 中捕获等效项的主要内容,如果未能解决你的问题,请参考以下文章
Postgres中'money'和'OID'的sqlalchemy等效列类型是啥?
如何在pyspark Hive SQL中获取等效的postgres命令'nth_value'以进行分区?
如何在 pyspark Hive SQL 中获取等效的 postgres 命令“nth_value”?