2009-09-08 58 views
1

我有一個表結構爲:如何創建一個將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視圖?

回答

1

在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'; 

(是的,我知道對性能的要求和理由不這樣做)

0

我要說的是,這應該在應用程序代碼,如果處理可能。由於它是一個CSV字段,我假設條目數很少,例如,每個數據庫行有< 1000。因此,內存和CPU成本不會過高,不能在逗號分割並根據需要進行迭代。

是否有一個令人信服的理由,這必須在postgres而不是應用程序中完成?如果是這樣,也許你可以寫一個psql過程來填充一個臨時表,並將每行的結果分開。以下是使用逗號分割的示例:http://archives.postgresql.org/pgsql-novice/2004-04/msg00117.php

相關問題