Postgre SQL   发布时间:2022-05-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了postgresql – 在函数中使用postgres CTE的结果大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在使用函数中的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);

大佬总结

以上是大佬教程为你收集整理的postgresql – 在函数中使用postgres CTE的结果全部内容,希望文章能够帮你解决postgresql – 在函数中使用postgres CTE的结果所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: