2013-08-07 25 views
17

Jestem zupełnie nowa w świecie Oracle, więc może to być softball. Podczas pracy z raportem SSRS przekazuję ciąg stanów do widoku. Oszustwo polega na tym, że użytkownicy mogli również wybrać opcję z listy stanów o nazwie "[Brak zaznaczenia]" ... (ta część nie była wykonywana, a ja utknąłem z realizacją rzeczy w ten sposób)Warunkowa klauzula WHERE z instrukcją CASE w Oracle

Jeśli tak postanowią opcja Brak zaznaczenia, a następnie chcę po prostu zwrócić wszystkie stany domyślnie, w przeciwnym razie zwraca tylko listę stanów, które znajdują się na mojej liście rozdzielanej przecinkami.

To naprawdę wygląda na to, że powinno być łatwe, ale utknąłem. Oto kod, który mam do tej pory (tylko próbuję dostać próbkę do pracy), ale moje oczy w końcu zniknęły próbując je uruchomić.

Czy ktoś może wskazać mi kierunek?

 
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) 
; 

Odpowiedz

34

Można pisać klauzuli where jak:

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

Ewentualnie usunąć case całości:

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

Albo jeszcze lepiej:

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

'(inny 0) 'nie powinno mieć nawiasów . – zygimantus

+1

@zygimantus. . . Dziękuję Ci. Ciekawe, że nie ma historii edycji, ponieważ format kodu różni się od mojego zwykłego stylu wcięcia. Wszystko ustalone teraz. –