Oracle

對多個查詢列使用相同的 CASE WHEN 條件

  • August 21, 2015

是否有“更好”的方法來重寫SELECT多個列使用相同CASE WHEN條件的子句,以便只檢查一次條件?

請參見下面的範例。

SELECT
   CASE testStatus 
       WHEN 'A' THEN 'Authorized'
       WHEN 'C' THEN 'Completed'
       WHEN 'P' THEN 'In Progress'
       WHEN 'X' THEN 'Cancelled'
   END AS Status,

   CASE testStatus 
       WHEN 'A' THEN authTime
       WHEN 'C' THEN cmplTime
       WHEN 'P' THEN strtTime
       WHEN 'X' THEN cancTime
   END AS lastEventTime,

   CASE testStatus 
       WHEN 'A' THEN authBy
       WHEN 'C' THEN cmplBy
       WHEN 'P' THEN strtBy
       WHEN 'X' THEN cancBy
   END AS lastEventUser
FROM test

在非 sql 虛擬碼中,程式碼可能如下所示:

CASE testStatus
   WHEN 'A'
       StatusCol        = 'Authorized'
       lastEventTimeCol = authTime 
       lastEventUserCol = authUser
   WHEN 'C'
       StatusCol        = 'Completed'
       lastEventTimeCol = cmplTime
       lastEventUserCol = cmplUser
   ...
END

筆記:

  • 我知道查詢隱含的明顯規範化問題。我只是想證明這個問題。

即使在 Oracle 中(實際上是在 SQL 標準中),CASE也是一個返回單個值的表達式。它不像其他一些語言那樣用於控制流。因此,它不能用於在多列或其他操作之間進行有條件的決定。

我會說將較長版本的程式碼(已經有效)放在一個視圖中,並且不要在您的正式查詢中擔心它。

您還可以考慮更規範化的設計。例如,為什麼不將審計詳細資訊儲存在單獨的表中,並將類型作為鍵的一部分?這使您的程式碼更易於維護,尤其是在添加更多類型時…

引用自:https://dba.stackexchange.com/questions/18239