postgresql – 在函数中使用postgres CTE的结果
发布时间:2020-12-13 16:09:02 所属栏目:百科 来源:网络整理
导读:我在使用函数中的CTE结果时遇到困难.给出以下Postgres表. CREATE TABLE directory ( id SERIAL PRIMARY KEY,name TEXT,parent_id INTEGER REFERENCES directory(id));INSERT INTO directory (name,parent_id)VALUES ('Root',NULL),('D1',1),('D2',2),('D3',3
我在使用函数中的CTE结果时遇到困难.给出以下Postgres表.
CREATE TABLE directory ( id SERIAL PRIMARY KEY,name TEXT,parent_id INTEGER REFERENCES directory(id) ); INSERT INTO directory (name,parent_id) VALUES ('Root',NULL),('D1',1),('D2',2),('D3',3); 我有这个递归CTE,它返回目录的后代. WITH RECURSIVE tree AS ( SELECT id FROM directory WHERE parent_id = 2 UNION ALL SELECT directory.id FROM directory,tree WHERE directory.parent_id = tree.id ) 返回的值是我所期望的,可以使其等于数组 SELECT (SELECT array_agg(id) FROM tree) = ARRAY[3,4]; 我可以使用数组从表中选择值 SELECT * FROM directory WHERE id = ANY(ARRAY[3,4]); 但是,我无法使用CTE的结果来完成同样的事情. SELECT * FROM directory WHERE id = ANY(SELECT array_agg(id) FROM tree); 结果错误表示存在类型不匹配. HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 但是,我不确定如何正确地完成这个. 解决方法
使用:
SELECT * FROM directory WHERE id = ANY(SELECT unnest(array_agg(id)) FROM tree); 详见in this answer. 在子查询中使用unnest()是处理数组的一般方法: where id = any(select unnest(some_array)) 因为array_agg()和unnest()是反向操作,所以查询可以简单如下: SELECT * FROM directory WHERE id = ANY(SELECT id FROM tree); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |