在功能中使用postgres CTE的结果

时间:2015-07-28 20:24:24

标签: postgresql

我在使用函数中的CTE结果时遇到困难。给出以下Postgres表。

<basic-input ng-model="formData.official_name" data-visual="Official Name" data-placeholder="Name" pattern="regex.short"></basic-input>

我有这个递归CTE,它返回目录的后代。

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);

返回的值是我所期望的,可以使其等于数组

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];

但是,我无法使用CTE的结果来完成同样的事情。

SELECT * FROM directory WHERE id = ANY(ARRAY[3, 4]);

结果错误表示存在类型不匹配。

SELECT * FROM directory WHERE id = ANY(SELECT array_agg(id) FROM tree);

但是,我不确定如何正确地完成此任务。

1 个答案:

答案 0 :(得分:2)

使用:

database

查看详细解释in this answer

在子查询中使用SELECT * FROM directory WHERE id = ANY(SELECT unnest(array_agg(id)) FROM tree); 是处理数组的一般方法:

unnest()

由于where id = any(select unnest(some_array)) array_agg()是反向操作,因此查询可以简单如下:

unnest()