多次调用带有数组参数的集合返回函数
此讨论围绕一个名为 foo 的集合返回函数进行,该函数可以处理利用特定参数的数据数组,并提供包含一组行和附加列的结果。虽然该函数在单个数据集上成功运行,但在尝试处理多个数据集而不依赖数据 ID 进行引用时,它遇到了挑战。
修改语法的各种尝试,例如使用以下格式:
SELECT dataid, (foo(ARRAY_AGG(data)),1).* FROM dataset WHERE dataid = something -- only testing on 1 GROUP BY dataid
都没有成功,导致每个函数都被重复调用
解决方案:横向连接
在 PostgreSQL 9.3 及更高版本中,使用 LEFT JOIN LATERAL 构造通常会产生最佳结果:
SELECT sub.dataid, f.* FROM ( SELECT dataid, array_agg(data) AS arr FROM dataset WHERE dataid = something GROUP BY 1 ) sub LEFT JOIN LATERAL foo(sub.arr) f ON true;
此语法确保保留连接左侧的所有行,即使如果函数 foo 没有返回任何行。
如果 foo 确实不能返回任何行并且需要排除这些行,则可以使用以下语法:
CROSS JOIN LATERAL foo(sub.arr)
或其简写版本:
, foo(sub.arr)
这种方法记录在 PostgreSQL 手册中。
以上是如何在 PostgreSQL 中高效地多次调用带有数组参数的集合返回函数?的详细内容。更多信息请关注PHP中文网其他相关文章!