2013-07-11 15 views
6

Questa è una domanda semplice, ho letto alcuni dettagli sull'utilizzo di CASE nella clausola WHERE, ma non sono riuscito a farvi un'idea chiara su come utilizzarlo. Il sotto è il mio esempio di query:Oracle case inside where clausola

1 SELECT * FROM dual 
2 WHERE (1 =1) 
3  AND (SYSDATE+1 > SYSDATE) 
4  AND (30 > 40) 
5  AND (25 < 35); 

Ho un procedimento i_value come nel parametro. Devo ignorare la quarta riga se i_value è 'S' e devo ignorare la quinta riga se i_value è 'T'.

Grazie in anticipo.

risposta

2

penso che questo sia il modo migliore per risolvere il problema:

select * 
from dual 
where (1 = 1) 
     and (sysdate + 1 > sysdate) 
     and case 
      when i_value = 'S' 
       then 
       case 
        when (25 < 35) 
        then 1 
        else 0 
       end 
      when i_value = 'T' 
       then 
       case 
        when (30 > 40) 
        then 1 
        else 0 
       end 
      end = 1; 

Naturalmente, è possibile utilizzare SQL dinamico, ma sarebbe più difficile e meno efficace.

1
SELECT * FROM dual 
WHERE (1 =1) 
AND (SYSDATE+1 > SYSDATE) 
AND CASE WHEN i_value = 'S' THEN 1 ELSE CASE WHEN (30 > 40) THEN 1 ELSE 0 END END = 1 
AND CASE WHEN i_value = 'T' THEN 1 ELSE CASE WHEN (25 < 35) THEN 1 ELSE 0 END END = 1; 
+1

Questo non funzionerà come previsto. Perché se i_value viene passato come 'S', la quarta riga del tuo codice diventa 0 e la condizione fallisce. quindi, l'intera produzione non sarebbe nulla. Dai un'occhiata profonda – ajmalmhd04

+0

Oops: l'ho aggiornato per risolvere il problema. (In precedenza aveva "AND CASE WHEN i_value = 'S' THEN 0 ELSE ..." ha cambiato da 0 a 1 su entrambe le righe 4 e 5. –

+0

ha di nuovo un'occhiata;) – ajmalmhd04

1

Perché così ser uso case?

SELECT * FROM dual 
    WHERE (1 =1) 
    AND (SYSDATE+1 > SYSDATE) 
    AND (((30 > 40) and i_value <> 'S') or i_value = 'S') 
    AND (((25 < 35) and i_value <> 'T') or i_value = 'T'); 
+0

Questo è meglio comunque. Ma non adatto al mio codice. (Quanto sopra è una query di esempio che ho usato da una grande query). Quindi ho usato "if i_value = 'S' quindi" metodo. Altrimenti dovrei usare un grosso hardcoding su ogni linea. Grazie – ajmalmhd04

-1

Anche questo dovrebbe funzionare.

case 
    when (i_value = 'S' and (WHERE (1=1) AND (SYSDATE+1 > SYSDATE) AND (25 < 35))) then 1 
    when (i_value = 'T' and (WHERE (1=1) AND (SYSDATE+1 > SYSDATE) AND (30 < 40))) then 1 
    else 0 
end = 1