web-dev-qa-db-fra.com

Oracle SQL - CASE dans une clause WHERE

Est-il possible de faire cela d'une manière ou d'une autre?

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

Je sais que ma clause WHERE is n'est pas correcte.

Toute aide serait utile pour savoir si ce type de déclaration est possible.

Je ne veux pas écrire un SQL dynamique. Si je le dois, j'écrirai 2 instructions SQL différentes.

Merci

6
Pranav Shah

Merci d'avoir publié les exemples de données. Il serait également utile de décrire avec des mots et avec une sortie réelle ce que vous souhaitez que votre requête vous renvoie.

Je suppose que tu veux quelque chose comme

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.

Mais je fais beaucoup de suppositions sur ce que votre code est censé signifier.

Que cela semble être identique à une question posée par quelqu'un dans les forums OTN . Ma réponse est la même aux deux endroits.

14
Justin Cave

Essayez d'écrire la clause where de cette façon:

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

Les requêtes de Justin Cave et d'Eric Humphrey renvoient toutes deux des résultats différents. Voici une troisième réponse tout aussi valable qui renvoie un troisième ensemble de résultats différents:

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

Vous seul saurez quelle réponse donne les résultats que vous attendez, mais ce sont toutes des réponses correctes à la question telle qu'elle a été donnée.

Votre question est meilleure que beaucoup car elle est autonome et inclut les données source, mais cela vous aidera si vous incluez également la sortie que vous recherchez. Je vous recommande d'ajouter cela à la question et de vous assurer que la réponse acceptée correspond à ces résultats.

4
Leigh Riffel