20

所以,如果有这个字符串aassdd

这段代码:

regexp_matches('aassdd', 'a', 'g')

返回 2 个不同的行。

是否可以将所有匹配项检索为一行?例如作为array一行的类型,即来自上面的代码,需要的结果是:{a,a}

4

4 回答 4

21

regexp_matches() 返回一个集合而不是一个标量这一事实是可以理解的,但仍然有些烦人。

我发现的唯一解决方法是这个有点难看的查询:

select array_agg(i)
from (
   select (regexp_matches('aassdd', 'a', 'g'))[1] i 
)  t
于 2013-05-17T13:58:01.127 回答
10
SELECT ARRAY(select array_to_string(regexp_matches('aassdd', 'a', 'g'),''));
于 2013-05-17T13:53:13.070 回答
1

如果 regexp_matches() 将索引表的列作为参数,还有另一种方法:

SELECT rid, array_agg(number) 
FROM 
    (SELECT 
       rid, 
       (regexp_matches(column,'[0-9]+','g'))[1] as number 
    FROM table) t
GROUP BY rid
于 2016-09-09T13:00:27.493 回答
0

plperl

如果您正在寻找一些高性能的东西,

CREATE LANGUAGE plperl;

CREATE FUNCTION regexp_return_matches(text, text)
RETURNS text[]
AS $$
  my ( $input, $pattern ) = @_;
  $pattern = quotemeta($pattern);
  return [$input =~ m/($pattern)/g];
$$ LANGUAGE plperl;

SELECT regexp_return_matches('aassdd', 'a');
 regexp_return_matches 
-----------------------
 {a,a}
(1 row)
于 2018-01-01T00:08:53.023 回答