我有一個表結構爲:如何創建一個將csv字段分解爲多行的視圖?
create table a (
a bigint primary key,
csv varchar(255)
)
我希望能夠查詢視圖( 「B」),使得:
select * from b;
息率是這樣的:
a | b
------
1 | A
1 | B
1 | C
對於初始表有一行數據(1,'A,B,C')的情況。
這是可能與postgres視圖?
我有一個表結構爲:如何創建一個將csv字段分解爲多行的視圖?
create table a (
a bigint primary key,
csv varchar(255)
)
我希望能夠查詢視圖( 「B」),使得:
select * from b;
息率是這樣的:
a | b
------
1 | A
1 | B
1 | C
對於初始表有一行數據(1,'A,B,C')的情況。
這是可能與postgres視圖?
在Postgres 8.4(我相信8.3)中,regexp_split_to_table可用。這可行,但是,我也需要8.1的東西。
這似乎是確定的工作:
create or replace function split_xmcuser_groups_to_tuples() RETURNS SETOF RECORD AS $$
DECLARE
r a%rowtype;
strLen integer;
curIdx integer;
commaCnt integer;
curCSV varchar;
BEGIN
curIdx := 1;
commaCnt := 1;
FOR r IN SELECT * FROM a
LOOP
strLen := char_length(r.csv);
while curIdx <= strLen LOOP
curIdx := curIdx + 1;
if substr(r.csv, curIdx, 1) = ',' THEN
commaCnt := commaCnt + 1;
END IF;
END LOOP;
curIdx := 1;
while curIdx <= commaCnt LOOP
curCSV := split_part(r.csv, ',', curIdx);
if curCSV != '' THEN
RETURN QUERY select r.a,curCSV;
END IF;
curIdx := curIdx + 1;
END LOOP;
END LOOP;
RETURN;
END
$$ LANGUAGE 'plpgsql';
(是的,我知道對性能的要求和理由不這樣做)
我要說的是,這應該在應用程序代碼,如果處理可能。由於它是一個CSV字段,我假設條目數很少,例如,每個數據庫行有< 1000。因此,內存和CPU成本不會過高,不能在逗號分割並根據需要進行迭代。
是否有一個令人信服的理由,這必須在postgres而不是應用程序中完成?如果是這樣,也許你可以寫一個psql過程來填充一個臨時表,並將每行的結果分開。以下是使用逗號分割的示例:http://archives.postgresql.org/pgsql-novice/2004-04/msg00117.php