2016-08-08 8 views
0

でスイッチ/ケース私はSQLでこれをやろうとしている:SQL:where句

where (table1.col1 = table1.col2 
    and table2.col1 in ('01','02')) or 
     (table1.col1 <> table1.col2 
    and table2.col1 in ('03','04')) 

私はSwitch/Caseで行う方法を知りたい、私が試してみたい(ただし、失敗した):

where table2.col1 in case 
     when table1.col1 = table1.col2 then 
      ('01','02') 
     else 
      ('03','04') 
     end 
+1

大文字と小文字の区別なしにAND/ORにスティックします。 – jarlh

答えて

0

実行したいのは、実行するSQLクエリの部分に基づいて条件を指定することです。

スイッチ/ケースを使用すると、条件を指定することができ、条件に基づいて "then"部分が何らかのアクションを実行します。

あなたがしようとしていること:「then( '01'、 '02')」はSQLに意味をなさない。ここでは、実行するアクション/クエリを指定する必要があります。 CASE 表現のための効果として、OPで試みているように示されている何

0

は、不適切な使用方法です。 CASE式はの結果式を返します。そのうち( '01'、 '02')は評価可能な式ではありません。しかし、値節は有効な結果になります

次のWHERE節をテストしたDB2の亜種は、私が期待していなかったエラー[sqlcode:-811 "結果が複数の行"]でした。すなわち、IN述語の場合、複数の行が受け入れられるべきである。 DB2の他のいくつかの変種\レベルで使用する場合、おそらく、このコーディングは有効かつ機能的であるかもしれない?:

where table2.col1 IN (case when table1.col1 = table1.col2 
          then (values('01'), ('02')) end) 
    or table2.col1 IN (case when table1.col1 <> table1.col2 
          then (values('03'), ('04')) end) 

私は予想通り句が作業を行ったWHERE以下; CASE式を採用している上記のWHERE句の有効な同等物であると推測されたもの。 、私は目標はCASE式を使用したいとは何かわからないけど、FWIW、私はさらに以下のものを提供

where table2.col1 in (select c2        
         from (values('01'), ('02')) as s (c2) 
         where table1.col1 = table1.col2 ) 
    or table2.col1 in (select c2        
         from (values('03'), ('04')) as s (c2) 
         where table1.col1 <> table1.col2 ) 

た:もちろん、非常に目立つ、これはがどのCASEロジックを使用していませんOPにあるものと全く同じですが、レビューでいくらかの価値があるかもしれません。 WHERE句は、ケースを使用して、OPのWHERE句と同じロジックを実行します。括弧内の2番目の述語とAND演算された最初のIN述語はオプションですが、オプティマイザがその制約をすぐに認識できる可能性が高まると仮定して、OR論理の外でtable2.col1にどのような値を許可するかを明示します。データ:

where table2.col1 in ('01', '02', '03', '04')    
    and ( table1.col1 = case when table2.col1 in ('01','02') 
           then table1.col2 end   
     or table1.col1 <> case when table2.col1 in ('03','04') 
           then table1.col2 end   
     )