Oracle
對多個查詢列使用相同的 CASE WHEN 條件
是否有“更好”的方法來重寫
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
也是一個返回單個值的表達式。它不像其他一些語言那樣用於控制流。因此,它不能用於在多列或其他操作之間進行有條件的決定。我會說將較長版本的程式碼(已經有效)放在一個視圖中,並且不要在您的正式查詢中擔心它。
您還可以考慮更規範化的設計。例如,為什麼不將審計詳細資訊儲存在單獨的表中,並將類型作為鍵的一部分?這使您的程式碼更易於維護,尤其是在添加更多類型時…