Получать результаты из 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
Если вы ищете что-то несколько своеобразное,
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)