多次調用帶有數組參數的集合返回函數
此討論圍繞一個名為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中文網其他相關文章!