7

问题

这段代码:

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 删除大括号的最有效方法是什么?

4

1 回答 1

8

最优解

您的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最终已被清理:

于 2012-05-15T11:53:21.667 回答