我有一个表结构为:如何创建一个将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