2013-08-07 31 views
17

Tôi hoàn toàn mới với thế giới Oracle, vì vậy đây có thể là một quả bóng mềm. Trong khi làm việc với một báo cáo SSRS, tôi đang đi qua một chuỗi các trạng thái để xem. Xoắn là người dùng cũng có thể chọn một lựa chọn từ danh sách nhà nước được gọi là "[Không có lựa chọn]" ... (phần đó không phải bằng cách làm và tôi bị mắc kẹt khi thực hiện mọi thứ theo cách này)Điều khoản WHERE có điều kiện với tuyên bố CASE trong Oracle

Nếu họ chọn tùy chọn No Selection, sau đó tôi chỉ muốn trả về tất cả các trạng thái theo mặc định, nếu không chỉ trả về danh sách các trạng thái nằm trong danh sách được phân tách bằng dấu phẩy của tôi.

Điều này thực sự có vẻ như nó phải dễ dàng nhưng tôi bị mắc kẹt. Đây là mã tôi có cho đến nay (chỉ cần cố gắng để có được một mẫu để làm việc) nhưng đôi mắt của tôi cuối cùng đã đi qua cố gắng để có được nó đi.

Có ai có thể cho tôi một số hướng về điều này không?

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

Trả lời

34

Bạn có thể viết mệnh đề where như:

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

Ngoài ra, loại bỏ các case hoàn toàn:

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

Hoặc, thậm chí tốt hơn:

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

'(khác 0) 'không nên có dấu ngoặc . – zygimantus

+1

@zygimantus. . . Cảm ơn bạn. Nó thực sự tò mò rằng không có lịch sử chỉnh sửa, bởi vì định dạng của mã khá khác với phong cách thụt đầu dòng thông thường của tôi. Tất cả đã được sửa. –