我正在尋找像regexp_split_to_table這樣的函數,但是我們的db版本是8.2.9,所以它沒有它。我在一個空間真的只有分裂,所以像sql在postgresql中將空格拆分爲表格
how now brown cow
字符串將返回
+------+
|Column|
+------+
|how |
|now |
|brown |
|cow |
+------+
是有可以處理這個簡單的功能,或者說我有我自己寫的?
我正在尋找像regexp_split_to_table這樣的函數,但是我們的db版本是8.2.9,所以它沒有它。我在一個空間真的只有分裂,所以像sql在postgresql中將空格拆分爲表格
how now brown cow
字符串將返回
+------+
|Column|
+------+
|how |
|now |
|brown |
|cow |
+------+
是有可以處理這個簡單的功能,或者說我有我自己寫的?
您可以使用unnest函數將數組拆分爲結果集,並且可以使用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;
$$;
我想你必須自己去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)
很明顯,你可以擴展到處理您選擇的分隔符(請注意,我不確定您是否真的想要列名爲「列」,需要標識符引用以避免關鍵字衝突,但是,您在那裏)。
我沒有plperl一起工作,這可以很容易地完成w/plpgsql? – veilig 2010-01-03 01:42:15
@veilig,是的,已更新。 – pilcrow 2010-01-03 03:24:54
@pilcrow,你的函數工作的很好,但是當我嘗試執行一個查詢,如[從表中選擇string_to_rows(column)]時,我遇到了問題。 不斷給我錯誤: 錯誤:上下文中調用的集值函數無法接受集合。 環顧在線我看到我需要調用像[select * from string_to_rows(text)]。 是否可以調用此函數並傳入一組? ie [select * from string_to_rows(select col from table)]]。 – veilig 2010-01-03 16:04:24
*用於* generate_series *和* unnest *。 – pilcrow 2010-01-03 15:46:53