这是我第一次使用regexp_matches,我发现使用它只会返回与SELECT子句中所有regexp_matches匹配的行。
例如:
SELECT parameters,
regexp_matches(parameters, 'a=(\d+)'),
regexp_matches(parameters, 'b=(\d+)')
FROM table;
将返回带有参数为a=1&b=1
但不是a=1
或b=1
它表现得好像是where子句。这是为什么?
答案 0 :(得分:4)
这是因为regexp_matches()
返回行集。
如果没有匹配,则不返回任何行。
使用一个正则表达式进行搜索,例如:
SELECT
parameters,
regexp_matches(parameters, '[a|b]=(\d+)')
FROM a_table;
或者,如果您想获得a
和b
的两列:
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<,...>}
,每个匹配组一个)。