web-dev-qa-db-fra.com

Clause WHERE conditionnelle avec instruction CASE dans Oracle

Je suis nouveau dans le monde Oracle, donc cela pourrait être une balle molle. En travaillant avec un rapport SSRS, je passe une chaîne d'états à une vue. Le problème, c’est que les utilisateurs pouvaient également choisir une sélection dans la liste d’états intitulée "[Aucune sélection]" ... (cette partie n’était pas faite par le fait et je suis coincé dans la mise en œuvre de cette manière)

S'ils choisissent l'option Aucune sélection, je souhaite simplement renvoyer tous les états par défaut. Sinon, je ne renvoie que la liste des états qui se trouvent dans ma liste séparée par des virgules.

Cela semble vraiment comme ça devrait être facile mais je suis coincé. Voici le code que j'ai jusqu'à présent (juste pour obtenir un échantillon au travail) mais mes yeux se sont finalement croisés pour essayer de le faire fonctionner.

Quelqu'un pourrait-il me donner des instructions à ce sujet s'il vous plaît?

 commencer 
: code de l'état: = 'MO, FL, TX'; 
 -: code de l'état: = '[Aucune sélection]'; 
 fin; 
/
 
 sélectionner count (*) comme StateCount,: stateCode comme SelectedVal 
 à partir de hcp_state vw 
 où 
 (cas 
 when (: stateCode = '') puis (1) 
 when (: stateCode! = '') puis (vw.state_cd dans (: stateCode)) 
 (sinon 0) 
  fin)
;
22
Rob Horton

Vous pouvez écrire la clause where en tant que:

where (case when (:stateCode = '') then (1)
            when (:stateCode != '') and (vw.state_cd in (:stateCode)) then 1
            else 0)
       end) = 1;

Sinon, supprimez entièrement le case:

where (:stateCode = '') or
      ((:stateCode != '') and vw.state_cd in (:stateCode));

Ou encore mieux:

where (:stateCode = '') or vw.state_cd in (:stateCode)
41
Gordon Linoff