尝试在 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”?

debezium 是不是支持捕获 postgres 模式更改事件?

此 SQL 的 Cosmos DB 等效项

Postgres 的 "\connect" 命令的 JDBC 对应项是啥?