2013-08-07 15 views
17

Sono nuovo di zecca per il mondo Oracle, quindi questo potrebbe essere un softball. Lavorando con un rapporto SSRS, sto passando una serie di stati a una vista. La torsione è che gli utenti possono anche scegliere una selezione dalla lista stato chiamato "[Nessuna selezione]" ... (che parte non era da fare e mi sono bloccato con le cose di attuazione in questo modo)Clausola WHERE condizionale con l'istruzione CASE in Oracle

Se scelgono l'opzione Nessuna selezione, quindi voglio solo restituire tutti gli stati per impostazione predefinita, altrimenti restituire solo l'elenco degli stati che sono nel mio elenco separato da virgole.

Questo sembra davvero dovrebbe essere facile ma sono bloccato. Ecco il codice che ho finora (solo cercando di far funzionare un campione) ma i miei occhi sono finalmente passati incrociati cercando di farlo funzionare.

Qualcuno potrebbe darmi qualche indicazione su questo per favore?

 
begin 
    :stateCode:='MO,FL,TX'; 
    --:stateCode:='[ No Selection ]'; 
end; 
/

select count(*) as StateCount, :stateCode as SelectedVal 
from hcp_state vw 
where 
    (case 
     when (:stateCode = '') then (1) 
     when (:stateCode != '') then (vw.state_cd in (:stateCode)) 
     (else 0) 
    end) 
; 

risposta

34

è possibile scrivere la clausola where come:

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

In alternativa, rimuovere il case tutto:

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

O, ancora meglio:

where (:stateCode = '') or vw.state_cd in (:stateCode) 
+0

'(altro 0) 'non dovrebbe avere parentesi . – zygimantus

+1

@zygimantus. . . Grazie. È davvero curioso che non ci sia una cronologia delle modifiche, perché il formato del codice era molto diverso dal mio solito stile di indentazione. Tutto risolto ora. –