は、不適切な使用方法です。 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
)
大文字と小文字の区別なしにAND/ORにスティックします。 – jarlh