it-swarm.com.de

Oracle SQL - CASE in einer WHERE-Klausel

Ist das irgendwie möglich?

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

Ich weiß, dass meine WHERE is-Klausel nicht korrekt ist.

Jede Hilfe wäre hilfreich zu wissen, ob diese Art von Aussage möglich ist.

Ich möchte kein dynamisches SQL schreiben. Wenn ich muss, schreibe ich 2 verschiedene SQL-Anweisungen.

Vielen Dank

6
Pranav Shah

Vielen Dank für die Veröffentlichung der Beispieldaten. Es wäre auch hilfreich, in Worten und mit tatsächlicher Ausgabe zu beschreiben, was Sie von Ihrer Abfrage zurückgeben möchten.

Ich vermute, dass Sie so etwas wollen

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.

Aber ich mache viele Vermutungen darüber, was Ihr Code bedeuten soll.

Dass dies mit einer Frage identisch zu sein scheint, die jemand in den OTN-Foren gestellt hat. Meine Antwort ist an beiden Stellen gleich.

14
Justin Cave

Versuchen Sie, die where-Klausel folgendermaßen zu schreiben:

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

Die Anfragen von Justin Cave und Eric Humphrey liefern unterschiedliche Ergebnisse. Hier ist eine dritte gleichermaßen gültige Antwort, die einen dritten unterschiedlichen Satz von Ergebnissen zurückgibt:

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

Nur Sie wissen, welche Antwort die erwarteten Ergebnisse liefert, aber alle sind die richtigen Antworten auf die gegebene Frage.

Ihre Frage ist besser als viele andere, da sie in sich geschlossen ist und die Quelldaten enthält. Sie ist jedoch hilfreich, wenn Sie auch die Ausgabe angeben, nach der Sie suchen. Ich empfehle Ihnen, dies der Frage hinzuzufügen und sicherzustellen, dass die akzeptierte Antwort mit diesen Ergebnissen übereinstimmt.

4
Leigh Riffel