给定一个文件名:
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 的日期值