2017-03-07 48 views
0

我有一個巨大的查詢,我想知道是否可能在Oracle中使用 來獲取case-when-statement的結果並將其用於比較?我的CASE-STATEMENT在Select-Statement中聲明,它看起來像這樣。ORACLE:CASE-WHEN-STATEMENT的使用結果

SELECT........ 
    (CASE 
    WHEN (Select 1 from DUAL) = 1 THEN 'TEST' 
    ELSE 'TEST2' 
    END) AS TEST; 

現在我想要得到這個case-statement的結果並在where部分使用它?可能嗎? (Sry基因,這可能是一個愚蠢的問題)

+1

你在你的問題問的確切方式是不可能的。如果您在SELECT語句中將標記爲(別名)的表達式定義爲'TEST',則名稱'TEST'在同一個'SELECT'查詢的WHERE子句中不可見,因爲處理了WHERE在SELECT之前。如果你不想在WHERE子句中重複相同的(可能很長)'CASE'表達式,你最好在子查詢中定義'TEST',然後在WHERE子句中選擇並使用它外部查詢。 (你可以用'WITH'子句來做到這一點。)更適合將來的代碼維護。 – mathguy

回答

2

如果您在嵌入視圖或公用表表達式(又名WITH子句)中定義CASE語句,則可以通過您提供的任何別名來引用它。

例如(在線觀看):

SELECT ... 
FROM (SELECT ..... 
     (CASE 
      WHEN (Select 1 from DUAL) = 1 THEN 'TEST' 
      ELSE 'TEST2' 
      END) AS TEST 
     FROM... 
     ) v 
WHERE v.test = 'TEST2'; 

因爲公用表表達式,這將是:

WITH cte AS (SELECT........ 
       (CASE 
        WHEN (Select 1 from DUAL) = 1 THEN 'TEST' 
        ELSE 'TEST2' 
       END) AS TEST 
       FROM ...) 
SELECT ... 
FROM cte 
WHERE test = 'TEST2'; 
1

您可以在where子句中使用case語句中,例如:

select * from table 
where table.field = (CASE 
         WHEN (Select 1 from DUAL) = 1 THEN 'TEST' 
         ELSE 'TEST2' 
        END) 

這將比較從case語句表字段返回的值。