2017-03-07 7 views
0

私は巨大なクエリを持っていますが、それが可能であれば のcase-when-statementの結果を得て比較のために使用できるかどうか疑問に思っていますか?私のCASE-STATEMENTはSelect-Statementで宣言されており、次のようになります。ORACLE:case-when-statementの結果を使用

ここで、このケースステートメントの結果を取得し、どこの部分で使用したいのですか?出来ますか?

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

これは、テーブルのフィールドを持つcaseのステートメントから返された値を比較します。:

+1

正確な方法は不可能です。 'SELECT'節で' TEST'とラベル付けした(別名付きの)式を定義すると、 'WHERE'が処理されるため、同じ' SELECT'クエリの 'WHERE'節に' TEST'という名前は見えません'SELECT'の前に。 'WHERE'節で同じ(おそらく非常に長い)' CASE'式を繰り返さない場合は、サブクエリで 'TEST'を定義する方が良いでしょう。次に' WHERE'節の 'WHERE'節でそれを選択して使います。外側のクエリ(あなたは 'WITH'節でそれを行うことができます。)将来のコード管理のためにも良いでしょう。 – mathguy

答えて

2

CASEステートメントをインラインビューまたは共通テーブル式(別名WITH句)で定義すると、それを与えるエイリアスで参照できます。

例えば(インライン・ビュー):共通テーブル式として

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ステートメントを使用することができます(SRYこれはばかな質問かもしれません)。

関連する問題