gpt4 book ai didi

regexp_matches 在 plpgsql 函数中返回 NULL

转载 作者:行者123 更新时间:2023-11-29 12:47:06 24 4
gpt4 key购买 nike

给定一个文件名:

xxxx/2013-02/csv/Sales_1302040000-1302050000.zip

有人可以解释为什么 regexp_matches 在此函数中返回 null 吗:

CREATE OR REPLACE FUNCTION get_import_batch_date(filename text) 
RETURNS DATE AS
$BODY$
DECLARE
matches text[];
result date;
BEGIN

matches := regexp_matches(filename, E'Sales_(\\d{2})(\\d{2})(\\d{2})');
IF matches IS NOT NULL THEN
result := format('%s-%s-%s', 2000 + matches[1]::int, matches[2], matches[3])::DATE;
RETURN result;
END IF;

RAISE WARNING 'Unable to determine batch date from %', filename;

RETURN NULL;

END;
$BODY$
LANGUAGE plpgsql IMMUTABLE;

然而,在以下匿名函数中工作:

DO language plpgsql $$
DECLARE
filename text := 'xxxx/2013-02/csv/Sales_1302040000-1302050000.zip';
matches text[];
result date;
BEGIN

matches := regexp_matches(filename, E'Sales_(\\d{2})(\\d{2})(\\d{2})');
IF matches IS NOT NULL THEN
result := format('%s-%s-%s', 2000 + matches[1]::int, matches[2], matches[3])::DATE;
raise notice '%', result;
END IF;

END;
$$;

并且 regexp_matches 似乎在此查询中正常工作,但函数再次失败并返回 null

SELECT
regexp_matches('xxxx/2013-02/csv/Sales_1302040000-1302050000.zip', E'Sales_(\\d{2})(\\d{2})(\\d{2})'),
get_import_batch_date('xxxx/2013-02/csv/Sales_1302040000-1302050000.zip');

我的代码中是否存在我只是没有看到的错误(非常可能且最常见的答案),或者我在这里没有做些什么?

我正在使用 PostgreSQL 9.1.6

最后一点:给定这个文件名,我希望函数返回 2013-02-04 的日期值

最佳答案

更新:

问题原来是对 pgAdmin 中的 pgScript 的混淆。 @David 在 pgAdmin 的查询工具中按 F6 来运行 pgScript 而不是 F5 来运行 SQL 脚本。查看comments below .
函数本身没问题。

简化功能

我无法重现您的错误(在 Postgres 9.1.6 上测试,未返回 NULL),但我可以为您提供一个更简单的版本可能不会失败的功能:

CREATE OR REPLACE FUNCTION get_import_batch_date(filename text, OUT result date)
AS
$func$
BEGIN
result := ('20' || substring(filename, E'Sales_(\\d{6})'))::date;

IF result IS NULL THEN
RAISE WARNING 'Unable to determine batch date from %', filename;
END IF;
END
$func$ LANGUAGE plpgsql IMMUTABLE;
  • 使用 OUT 参数来简化事情。

  • 不需要相当复杂的 regexp_matches() 表达式和它需要的数组转换。一个简单的 substring() 调用就可以完成这项工作。在 20 前面加上您可以立即转换为 date。该格式与在任何 语言环境中有效的 ISO 8601 日期格式匹配。您的原始版本也依赖于此,只是添加了可选的连字符 (-)。

     `'20130204'::date` works just as well as `'2013-02-04'::date`

  • 不需要RETURNOUT参数result的值会自动返回。

关于regexp_matches 在 plpgsql 函数中返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14720394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com