Я думаю, вам нужно будет 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)
Очевидно, что вы можете расширить это, чтобы справиться с разделителем по вашему выбору и т. д. (Заметьте, я не уверен, действительно ли вам нужен столбец с именем «Столбец», требующий котировки идентификатора, чтобы избежать столкновения с ключевым словом, но там вы.)
+1 для * generate_series * и * unsest *. – pilcrow