PostgreSQL regexp_matches只返回匹配它的行?

时间:2015-12-10 19:56:45

标签: postgresql

这是我第一次使用regexp_matches,我发现使用它只会返回与SELECT子句中所有regexp_matches匹配的行。

例如:

SELECT parameters, 
regexp_matches(parameters, 'a=(\d+)'), 
regexp_matches(parameters, 'b=(\d+)')
FROM table;

将返回带有参数为a=1&b=1但不是a=1b=1

的行的结果

它表现得好像是where子句。这是为什么?

2 个答案:

答案 0 :(得分:4)

这是因为regexp_matches()返回行集。 如果没有匹配,则不返回任何行。

使用一个正则表达式进行搜索,例如:

SELECT 
    parameters, 
    regexp_matches(parameters, '[a|b]=(\d+)')
FROM a_table;

或者,如果您想获得ab的两列:

SELECT parameters, a, b
FROM (
    SELECT 
        parameters, 
        regexp_matches(parameters, 'a=(\d+)') a,
        null b
    FROM a_table
    UNION
    SELECT 
        parameters,
        null,
        regexp_matches(parameters, 'b=(\d+)')
    FROM a_table
    ) s;

答案 1 :(得分:0)

解决此问题的另一种方法是,除了要查找的模式之外,还可以在字符串的末尾进行匹配。

SELECT parameters,
regexp_matches(parameters, '(a=(\d+))|$'), 
regexp_matches(parameters, '(b=(\d+))|$')
FROM table;

然后您可能需要进行其他处理,因为任何缺少模式的字符串都将显示为{NULL}(或{NULL,NULL<,...>},每个匹配组一个)。