【问题标题】:How to create a view that explodes a csv field into multiple rows?如何创建一个将 csv 字段分解为多行的视图?
【发布时间】:2009-09-08 20:18:10
【问题描述】:

我的表格结构如下:

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 视图实现吗?

【问题讨论】:

    标签: sql postgresql


    【解决方案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';
    

    (是的,我知道性能影响和不这样做的原因)

    【讨论】:

      【解决方案2】:

      如果可能的话,我会说这应该在应用程序代码中处理。由于它是一个 CSV 字段,我假设条目数很少,例如,每个数据库行

      这是否有令人信服的理由必须在 postgres 而不是应用程序中完成?如果是这样,也许您可​​以编写一个 psql 过程来用拆分每一行的结果填充一个临时表。下面是一个使用逗号分割的例子:http://archives.postgresql.org/pgsql-novice/2004-04/msg00117.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-12
        • 1970-01-01
        相关资源
        最近更新 更多