如何引用函数返回的记录的各个列?

GaN*_*RdE 4 postgresql postgresql-9.1

我有一个返回setof record类型的函数。

CREATE TYPE CIR_TYPE AS
(
    ID integer,
    path text,
    cycle boolean
);

CREATE OR REPLACE FUNCTION circular_ref() RETURNS setof CIR_TYPE AS $body$

DECLARE
    r CIR_TYPE;

BEGIN
    For r in WITH RECURSIVE graph(ID, path, cycle) AS (
                SELECT id AS id
                     , ARRAY[parentid, id] AS path
                     , (parentid = id) AS cycle    
                FROM  mytable

                UNION ALL

                SELECT d.id, d.parentid ||path, d.parentid = ANY(path)
                FROM   graph g
                JOIN   mytable d ON d.id = g.path[1]
                WHERE  NOT g.cycle
             )
             SELECT DISTINCT *
             FROM   graph
    Loop

        If r.cycle= TRUE then
        Return NEXT r;
        End if;

    End loop;

END;
$body$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

当我执行上述函数时,我得到如下输出:

circular_ref
----------------------------
(0,"{1,0,1}",t)
(1,"{0,1,0}",t)
Run Code Online (Sandbox Code Playgroud)

这里0and 1are ID{0,1,0}and {0,1,0}are pathandt表示循环。

我想打印输出

ID     |    Path
----       ------
0      |   1,0,1
1      |   0,1,0
Run Code Online (Sandbox Code Playgroud)

请建议如何获得预期的结果。

dez*_*zso 6

我猜这个问题从 PostgreSQL 开始就困扰着每个人。幸运的是,解决方案相当简单:只需调用

SELECT * FROM circular_ref();
Run Code Online (Sandbox Code Playgroud)

代替

SELECT circular_ref();
Run Code Online (Sandbox Code Playgroud)

这样它就不会是你得到的单个记录,而是一个适当的行。这样,你甚至可以做

SELECT id, path FROM circular_ref();
Run Code Online (Sandbox Code Playgroud)

得到你想要的列。