Sql разделяет строку пробелом на таблицу в postgresql
Я ищу такую функцию, как regexp_split_to_table, но наш db - это версия 8.2.9, поэтому она ее не имеет. Я просто разделяю пространство, поэтому строка типа
как теперь коричневая корова
вернет
+------+
|Column|
+------+
|how |
|now |
|brown |
|cow |
+------+
есть ли простая функция, которая может справиться с этим, или что-то, что я должен написать себе?
Ответы
Ответ 1
Вы можете разбить массив на набор результатов с помощью функции unsest, и вы можете преобразовать строковый литерал в массив с помощью функции string_to_array. Объедините оба, и вы получите следующее:
alvherre=# select unnest(string_to_array('the quick lazy fox', ' '));
unnest
--------
the
quick
lazy
fox
(4 filas)
Так как 8.2 не имеет UNNEST, вы можете записать его в PostgreSQL следующим образом:
create or replace function unnest(anyarray) returns setof anyelement
language sql as $$
select $1[i] from generate_series(array_lower($1, 1),
array_upper($1, 1)) as i;
$$;
Ответ 2
Я думаю, вам придется RETURNS SET
или RETURNS TABLE
самостоятельно.
Обновленный ответ: с использованием PL/pgSQL:
pg=> CREATE OR REPLACE FUNCTION string_to_rows(text) RETURNS SETOF TEXT AS $$
DECLARE
elems text[];
BEGIN
elems := string_to_array($1, ' ');
FOR i IN array_lower(elems, 1) .. array_upper(elems, 1) LOOP
RETURN NEXT elems[i];
END LOOP;
RETURN;
END
$$ LANGUAGE 'plpgsql';
CREATE FUNCTION
pg=> SELECT "Column" FROM string_to_rows('how now brown cow') d("Column");
Column
--------
how
now
brown
cow
(4 rows)
Оригинальный ответ: с использованием PL/perl:
pg=> CREATE LANGUAGE plperl;
CREATE LANGUAGE
pg=> CREATE FUNCTION psplit_to_rows(text) RETURNS SETOF TEXT AS $$
pg$> for my $t (split ' ', $_[0]) { return_next $t; }
pg$> undef;
pg$> $$ LANGUAGE plperl;
CREATE FUNCTION
pg=> SELECT "Column" FROM psplit_to_rows('how now brown cow') d("Column");
Column
--------
how
now
brown
cow
(4 rows)
Очевидно, вы можете расширить это, чтобы обработать разделитель по вашему выбору и т.д. (Заметьте, я не уверен, действительно ли вам нужен столбец с именем "Столбец", требующий цитирования идентификатора, чтобы избежать столкновения с ключевыми словами, но там вы.)