Получать результаты из regexp_matches как одну строку

Итак, если эта строка aassdd

Этот код:

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

возвращает 2 разных строки.

Можно получить все совпадения в виде одной строки? например, как тип array виде одной строки, то есть из кода выше, нужный результат: {a,a}

Ответ 1

Тот факт, что regexp_matches() возвращает набор, а не скаляр, понятен, но все же несколько раздражает.

Единственным обходным решением, которое я нашел, является этот уродливый запрос:

select array_agg(i)
from (
   select (regexp_matches('aassdd', 'a', 'g'))[1] i 
)  t

Ответ 2

SELECT ARRAY(select array_to_string(regexp_matches('aassdd', 'a', 'g'),''));

Ответ 3

Если 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

Ответ 4

С 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)