此代码:
select
x::text
from
regexp_matches( 'i1 into o2, and g1 into o17', '[gio][0-9]{1,}', 'g' ) as x;
返回以下结果:
{i1}
{o2}
{g1}
{o17}
而不是以下结果:
i1
o2
g1
o17
使用PostgreSQL 9.x删除大括号的最有效方法是什么?
答案 0 :(得分:6)
您的regexp_matches()
模式每个模式评估只能生成一个元素,因此所有生成的行都被约束为一个数组元素。表达式简化为:
SELECT x[1]
FROM regexp_matches('i1 into o2, and g1 into o17', '[gio][0-9]{1,}', 'g') AS x;
SELECT unnest(x) -- also works for cases with multiple elements per result row
SELECT trim(x::text, '{}') -- corner cases with results containing `{}`
SELECT rtrim(ltrim(x::text, '{'), '}') AS x1 -- fewer corner cases
如果模式每个输入值可以匹配或不匹配多次,也请删除可选参数'g'
。
如果函数总是只返回一行,请考虑Postgres 10引入的略有不同的变体regexp_match()
。
在Postgres 10或更高版本中,谨慎地建议SELECT
列表中的集合返回函数(SRF)regexp_matches()
直接(如Rick provided),因为多个SRF的行为在SELECT
列表终于被消毒了: