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)
这里0
and 1
are ID
,{0,1,0}
and {0,1,0}
are path
andt
表示循环。
我想打印输出
ID | Path
---- ------
0 | 1,0,1
1 | 0,1,0
Run Code Online (Sandbox Code Playgroud)
请建议如何获得预期的结果。
我猜这个问题从 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)
得到你想要的列。
归档时间: |
|
查看次数: |
2454 次 |
最近记录: |