问题
这段代码:
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 删除大括号的最有效方法是什么?
这段代码:
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 删除大括号的最有效方法是什么?
您的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'
。
如果函数总是返回一行,考虑一下regexp_match()
Postgres 10 引入的微妙不同的变体。
regexp_matches()
在 Postgres 10 或更高版本中,直接在列表中建议 set-returning function (SRF) SELECT
(如Rick 提供的)也是谨慎的做法,因为列表中多个 SRF 的行为SELECT
最终已被清理: