從函數傳回的記錄顯示串聯列:揭示原因
在查詢中,連接表並從函數檢索歷史數據,用戶可能會遇到從函數傳回的列連接成單一字串的問題。當直接在主查詢中使用該函數時,會出現此異常。
了解問題
當查詢傳回多列的函數時,例如:
account_servicetier_for_day(acct.accountid, '2014-08-12')
它傳回包含所要求資料的記錄。但是,當此記錄嵌入到另一個查詢時,PostgreSQL 會將其解釋為單一連接字串。
分解函數輸出
要解決此問題,使用者應擷取單一字串函數記錄中的欄位。在PostgreSQL 9.3 及更高版本中,這可以使用JOIN LATERAL 語法來實現,該語法允許將函數無縫整合到FROM 子句中:
JOIN LATERAL account_servicetier_for_day(a.accountid, '2014-08-12') f ON TRUE
ON TRUE 子句確保左側的所有行無論傳回的行數為何,表都會與函數的結果連接。
在 PostgreSQL 9.2 及更早版本中,擷取列資料需要明確子查詢:
(SELECT *, account_servicetier_for_day(a.accountid, '2014-08-12') AS rec FROM account_tab a) AS a
這裡,子查詢將函式呼叫的結果指派給名為rec的記錄。然後,外部查詢可以引用記錄的列,例如 a.rec.timestamp。
避免 Not In (子查詢)
最後,建議避免使用NOT IN(子查詢)進行集合排除。相反,喜歡 NOT EXISTS 子句,它更有效率且不易出現效能問題。
以上是為什麼我的函數傳回的列在我的 PostgreSQL 查詢中串聯?的詳細內容。更多資訊請關注PHP中文網其他相關文章!