2009-09-08 62 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

相关问题