¿Es posible hacerlo de alguna manera?
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
Sé que mi cláusula WHERE is no es correcta.
Cualquier ayuda sería genial para saber si este tipo de declaración es posible.
No quiero escribir un SQL dinámico. Si tengo que hacerlo escribiré 2 sentencias SQL diferentes.
Gracias
Gracias por publicar los datos de ejemplo. También sería útil para describir en palabras y con salida real lo que usted quiere ser devuelto por su consulta.
Supongo que quiere algo como
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.
Pero estoy haciendo un montón de conjeturas acerca de lo que su código se supone que significa.
Que esto parece ser idéntica a una pregunta que alguien hizo en el OTN foros. Mi respuesta es la misma en ambos sitios.
Prueba a escribir la cláusula where de esta forma:
WHERE (T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE 'NOTHING%')
OR (T2.COMPARE_TYPE <> 'A' AND T1.SOME_TYPE NOT LIKE 'NOTHING%')
Las consultas de Justin Cave y Eric Humphrey arrojan resultados diferentes. He aquí una tercera respuesta igualmente válida que devuelve un tercer conjunto diferente de resultados:
WHERE (T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE 'NOTHING%')
OR T1.SOME_TYPE NOT LIKE 'NOTHING%'
Sólo tú sabrás qué respuesta te da los resultados que esperas, pero todas son respuestas correctas a la pregunta planteada.
Su pregunta es mejor que muchos porque es autónomo e incluye los datos de origen, pero ayudará si se incluye la salida que está buscando también. Te recomiendo que lo añadas a la pregunta y te asegures de que la respuesta aceptada coincide con esos resultados.