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
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.
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%')
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.