Получать результаты из 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)
Ответ 1 Тот факт, что regexp_matches() возвращает набор, а не скаляр, понятен, но все же несколько раздражает. Единственным обходным решением, которое я нашел, является этот уродливый запрос: select array_agg(i) from ( select (regexp_matches('aassdd', 'a', 'g'))[1] i ) t
Ответ 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)