我在使用函数中的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);
Run Code Online (Sandbox Code Playgroud)
我有这个递归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
)
Run Code Online (Sandbox Code Playgroud)
返回的值是我所期望的,可以使其等于数组
SELECT (SELECT array_agg(id) FROM tree) = ARRAY[3, 4];
Run Code Online (Sandbox Code Playgroud)
我可以使用数组从表中选择值
SELECT * FROM directory WHERE id = ANY(ARRAY[3, 4]);
Run Code Online (Sandbox Code Playgroud)
但是,我无法使用CTE的结果来完成同样的事情.
SELECT * FROM directory WHERE id = ANY(SELECT array_agg(id) FROM tree);
Run Code Online (Sandbox Code Playgroud)
结果错误表示存在类型不匹配.
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)
但是,我不确定如何正确地完成这个.
使用:
SELECT *
FROM directory
WHERE id = ANY(SELECT unnest(array_agg(id)) FROM tree);
Run Code Online (Sandbox Code Playgroud)
请参阅此答案中的详细解释。
在子查询中使用unnest()
是处理数组的通用方法:
where id = any(select unnest(some_array))
Run Code Online (Sandbox Code Playgroud)
因为array_agg()
和unnest()
是逆运算,所以查询可以简单如下:
SELECT *
FROM directory
WHERE id = ANY(SELECT id FROM tree);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
873 次 |
最近记录: |