次のファイル名が与えられた場合:
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 の日付値を返すようにする必要があります。