2013-07-11 8 views
6

Dies ist eine einfache Frage, ich habe einige Details über die Verwendung von CASE in WHERE -Klausel gelesen, konnte aber nicht in der Lage, eine klare Idee, wie man es verwenden. Die unten ist meine Beispielabfrage:Oracle Fall innerhalb wo Klausel

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

Ich habe ein Verfahren i_value wie in Parametern. Ich muss die vierte Zeile ignorieren, wenn i_value 'S' ist und ich muss die fünfte Zeile ignorieren, wenn i_value 'T' ist.

Vielen Dank im Voraus.

Antwort

2

Ich denke, dies ist der beste Weg, um Ihr Problem zu lösen:

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; 

Natürlich können Sie dynamische SQL verwenden könnte, aber es wäre schwieriger und weniger effektiv.

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

Dies wird nicht wie erwartet funktionieren. Wenn der i_value als 'S' übergeben wird, führt die 4. Zeile in Ihrem Code zu 0 und die Bedingung schlägt fehl. Also, die ganze Ausgabe wäre keine. Hab einen tiefen Blick. – ajmalmhd04

+0

Ups - Ich habe es aktualisiert, um das Problem zu beheben. (Vorher hatte "UND FALL WENN i_value = 'S' DANN 0 ELSE ..." habe die 0 auf 1 sowohl in der 4. als auch in der 5. Zeile geändert. –

+0

schau nochmal nach;) – ajmalmhd04

1

Warum so ser Verwendung 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

Das ist eh besser. Aber nicht passend zu meinem Code. (Das obige Beispiel ist eine Beispielabfrage, die ich aus einer großen Abfrage verwendet habe). Also habe ich "if i_value = 'S' then" Methode verwendet. Ansonsten müsste ich in jeder Zeile eine große Festcodierung verwenden. Vielen Dank – ajmalmhd04

-1

Dies sollte auch funktionieren.

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