PostgreSQL 對 SELECT 語句中多個集合回傳函數的處理:特定於版本的分析
當 SELECT
語句中遇到多個傳回集合的函數時,PostgreSQL 的行為會根據資料庫版本的差異而有很大差異。
PostgreSQL 10 及更高版本:
在版本 10 及更高版本中,這些函數會同步執行。 輸出的結構使得產生最多行的函數決定結果集中的總行數。 較短的函數輸出以 NULL
值填充以保持這種對齊,從而有效地創建類似交叉連接的結果。
PostgreSQL 9.6 及更早版本:
在 9.6 版本之前,結果有很大不同。產生的總行數等於每個集合傳回函數的行計數的最小公倍數 (LCM)。 這可能會導致不可預測且可能不理想的結果,特別是當行數沒有共同因素時。
範例:
讓我們檢查一下查詢:
<code class="language-sql">SELECT generate_series(1, 3), generate_series(5, 7);</code>
PostgreSQL 10 輸出:
<code> generate_series | generate_series -----------------+----------------- 1 | 5 2 | 6 3 | 7 NULL | NULL NULL | NULL NULL | NULL</code>
PostgreSQL 9.6-輸出:
<code> generate_series | generate_series -----------------+----------------- 1 | 5 2 | 6 3 | 7 1 | 5 2 | 6 3 | 7 1 | 5 2 | 6 3 | 7</code>
主要考慮因素:
CASE
和 COALESCE
表達式內使用傳回集合的函數。 LATERAL JOIN
和 ROWS FROM (...)
,而不是直接在 SELECT
清單中包含多個設定回傳函數。 相關文件:
以上是多個集合回傳函數在不同版本的 PostgreSQL SELECT 子句中的行為如何?的詳細內容。更多資訊請關注PHP中文網其他相關文章!