[英]How to support two conditions in the group by clause (postgresql)
[英]Why two logically same conditions in postgresql case clause have different behavior?
我有兩個查詢是 postgresql:
1. SELECT CASE WHEN (1=1) THEN NULL ELSE cast(1/0 as text) END;
2. SELECT CASE WHEN (EXISTS (SELECT 10)) THEN NULL ELSE cast(1/0 as text) END;
您可能已經注意到,兩個查詢中第一個條件的結果為真,但第一個查詢的結果為null
,第二個查詢的結果為ERROR: division by zero
這里發生了什么?
評估發生的順序是否有任何優化? 如果是,有什么理由關閉它?
當條件結果為真時,是否有任何原因在條件塊中有一個復雜的查詢,而不會在 else 塊中觸發運行時錯誤?
PostgreSQL 版本:13.1
該錯誤發生在計划查詢時,而不是運行時。
在第一種情況下,在計划時已知 1=1 為真,導致整個 CASE 折疊為 NULL::text。 因此, 1=1
和CASE WHEN true
的常量折疊使您免於1/0
的常量折疊異常。 您可以通過執行 EXPLAIN VERBOSE 來看到這一點。
當條件結果為真時,是否有任何原因在條件塊中有一個復雜的查詢,而不會在 else 塊中觸發運行時錯誤?
是的,除非它不是真正在運行時出現問題。
就像一個虛擬的 SELECT 打敗了防止問題的常量折疊,另一個虛擬選擇可以打敗導致問題的常量折疊。
SELECT CASE WHEN (EXISTS (SELECT 10)) THEN NULL::text ELSE cast (1/(select 0) as text) END;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.