2012-11-20 11 views
1

J'ai besoin d'une condition de filtre à inclure dans une requête de sélection lorsqu'une condition encapsulée dans une fonction est satisfaite. Si la condition n'est pas remplie, l'état du filtre ne doit pas être appliqué.CASE construct dans where clause

code:

select col_a,col_b,cancel_Date from tab_a 
where col_c = <<some_condition>> 
and (case when oracle_function() = 'YES' then 'tab_a.cancel_date is null' 
     else null 
    ) 

Si je vous écris cette façon, il jette l'erreur "opérateur relationnel non valide". Se rendant compte que le cas devrait résoudre à une valeur à droite, j'ai essayé d'ajouter quelque chose comme ce qui ne me donne pas le résultat escompté lorsque la condition est satisfaite:

select col_a,col_b,cancel_Date from tab_a 
where col_c = <<some_condition>> 
and (case when oracle_function() = 'YES' then 'tab_a.cancel_date is null' 
     else '1' 
    ) = '1' 

Mon résultat attendu devrait être:

Si oracle_function() = OUI, alors ma requête devrait permettre de résoudre efficacement:

select col_a,col_b,cancel_Date from tab_a 
where col_c = <<some_condition>> and tab_a.cancel_date is null; 

Else:

select col_a,col_b,cancel_Date from tab_a 
where col_c = <<some_condition>>; 

Des pensées?

Répondre

2

Au lieu de la déclaration case, cette requête exige que soit la fonction retourne une valeur autre que 'YES', ou que la date est nulle ... qui devrait être analogue à votre requête originale:

select col_a,col_b,cancel_Date 
from tab_a 
where col_c = <<some_condition>> 
and (oracle_function() <> 'YES' OR tab_a.cancel_date is null) 
+0

hmm. ..il suffit de le penser! Merci ! – Casey