存储regexp_matches会导致变量

时间:2015-11-27 14:57:46

标签: regex postgresql function plpgsql

在psql函数中,我使用regexp_matches。结果应分为2 var db_datum_von_stringdb_datum_von_string。但是,即使模式匹配2个字符串,第二个也始终为null。

第一个值是正确的。我想问题来自res[2],但我无法弄清楚它是什么。

请注意SELECT regexp_matches('1234ffdsafdsa 4554 ', '[0-9]+', 'g')完美无缺,并返回2行。

CREATE OR REPLACE FUNCTION ajl_TEST_datum_check(
      arg_datum_id integer,
      req_datum integer,
      flag integer
       ) RETURNS text AS $$
DECLARE
      db_datum text;
      db_datum_von_string text;
      db_datum_bis_string text;
      temp integer;
BEGIN
      SELECT datum.datum  INTO  db_datum
      FROM datum
      WHERE datum_id = arg_datum_id;

--- the issue starts here

    SELECT res[1], res[2] INTO db_datum_von_string, db_datum_bis_string
    FROM (SELECT regexp_matches(db_datum, '[0-9]+', 'g') res) y;

--- end of trouble


    IF db_datum_bis_string IS NULL THEN
        RETURN db_datum_von_string;
    ELSE 
        RETURN TRUE;
    END IF;

END;
$$ LANGUAGE plpgsql;

1 个答案:

答案 0 :(得分:2)

您的查询返回两行单元素数组值:

SELECT res[1], res[2]
FROM (
    SELECT regexp_matches('1234ffdsafdsa 4554 ', '[0-9]+', 'g') res
) y;

 res  | res 
------+-----
 1234 | 
 4554 | 
(2 rows)

您应该将行的元素转换为数组:

SELECT res[1], res[2]
FROM (
    SELECT array_agg(res) res
    FROM (
        SELECT unnest(regexp_matches('1234ffdsafdsa 4554 ', '[0-9]+', 'g')) res
        ) y
    ) x;

 res  | res  
------+------
 1234 | 4554
(1 row)