簡體   English   中英

為什么 postgresql case 子句中兩個邏輯上相同的條件有不同的行為?

[英]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=1CASE 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM