Oracle SQL - WHERE句のCASE

どうにかして、このようなことはできないでしょうか。

WITH T1 AS
(
   SELECT 1 AS SEQ, 'NOTHING 1' AS SOME_TYPE FROM DUAL UNION ALL
   SELECT 2 AS SEQ, 'NOTHING 2' AS SOME_TYPE FROM DUAL UNION ALL
   SELECT 3 AS SEQ, 'SOMETHING 1' AS SOME_TYPE FROM DUAL UNION ALL
   SELECT 4 AS SEQ, 'SOMETHING 2' AS SOME_TYPE FROM DUAL UNION ALL
   SELECT 5 AS SEQ, 'SOMETHING 3' AS SOME_TYPE FROM DUAL UNION ALL
   select 6 as seq, 'SOMETHING 4' AS SOME_TYPE from dual
)
, T2 AS
(
   SELECT 'A' AS COMPARE_TYPE FROM DUAL UNION ALL
   SELECT 'B' AS COMPARE_TYPE FROM DUAL 
)
SELECT T2.*, T1.* 
FROM T1, T2
WHERE  CASE T2.COMPARE_TYPE 
         WHEN 'A'
            THEN T1.SOME_TYPE LIKE 'NOTHING%'
         ELSE T1.SOME_TYPE NOT LIKE 'NOTHING%' 
      END

私のWHERE is句が正しくないことは分かっています。

このタイプのステートメントが可能であるかどうかを知るために、任意のヘルプは素晴らしいです。

私はダイナミックSQLを書きたくありません。 もしそうしなければならないなら、私は2つの異なるSQL文を書くでしょう。

ありがとうございます。

ソリューション

サンプルデータを掲載していただき、ありがとうございます。また、クエリによって返されたいものを言葉や実際の出力で記述していただけると助かります。

私は、あなたが以下のようなものを望んでいると推測しています。

SQL> ed
Wrote file afiedt.buf

  1  WITH T1 AS
  2  (
  3  SELECT 1 AS SEQ, 'NOTHING 1' AS SOME_TYPE FROM DUAL UNION ALL
  4  SELECT 2 AS SEQ, 'NOTHING 2' AS SOME_TYPE FROM DUAL UNION ALL
  5  SELECT 3 AS SEQ, 'SOMETHING 1' AS SOME_TYPE FROM DUAL UNION ALL
  6  SELECT 4 AS SEQ, 'SOMETHING 2' AS SOME_TYPE FROM DUAL UNION ALL
  7  SELECT 5 AS SEQ, 'SOMETHING 3' AS SOME_TYPE FROM DUAL UNION ALL
  8  select 6 as seq, 'SOMETHING 4' AS SOME_type from dual
  9  )
 10  , T2 AS
 11  (
 12  SELECT 'A' AS COMPARE_TYPE FROM DUAL UNION ALL
 13  SELECT 'B' AS COMPARE_type FROM DUAL
 14  )
 15  SELECT T2.*, T1.*
 16    FROM T1, T2
 17   WHERE (CASE WHEN T2.COMPARE_TYPE = 'A' AND
 18                    T1.SOME_TYPE LIKE 'NOTHING%'
 19                 THEN 1
 20               WHEN T2.COMPARE_TYPE != 'A' AND
 21                    T1.SOME_TYPE NOT LIKE 'NOTHING%'
 22                 THEN 1
 23               ELSE 0
 24*           END) = 1
SQL> / 

C        SEQ SOME_TYPE
- ---------- -----------
A          1 NOTHING 1
A          2 NOTHING 2
B          3 SOMETHING 1
B          4 SOMETHING 2
B          5 SOMETHING 3
B          6 SOMETHING 4

6 rows selected.

しかし、私はあなたのコードが何を意味するのかについて多くの推測をしています。

これがOTNフォーラムで誰かがした質問と同じに見えるということです。 私の答えは、どちらの場所でも同じです。

解説 (1)

where節をこのように書いてみてください。

WHERE (T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE 'NOTHING%')
   OR (T2.COMPARE_TYPE  'A' AND T1.SOME_TYPE NOT LIKE 'NOTHING%')
解説 (1)

Justin CaveとEric Humphreyのクエリは、どちらも異なる結果を返します。 以下は、同じように有効な3つ目の回答で、3つ目の異なる結果を返します。

WHERE (T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE 'NOTHING%')
OR T1.SOME_TYPE NOT LIKE 'NOTHING%' 

どの答えが期待する結果をもたらすかはあなただけが知ることですが、これらはすべて与えられた質問に対する正しい答えです。

あなたの質問は自己完結しており、ソースデータを含んでいるので、多くの質問よりも優れていますが、あなたが探している出力も含んでいれば助けになるでしょう。 質問にそれを追加し、受け入れられた答えがそれらの結果に一致することを確認することをお勧めします。

解説 (2)