2013-07-11 28 views
6

Đây là một câu hỏi đơn giản, tôi đã đọc một số chi tiết về việc sử dụng khoản CASE trong mệnh đề WHERE, nhưng không thể đưa ra ý tưởng rõ ràng về cách sử dụng nó. Dưới đây là truy vấn mẫu của tôi:Trường hợp Oracle bên trong mệnh đề

1 SELECT * FROM dual 
2 WHERE (1 =1) 
3  AND (SYSDATE+1 > SYSDATE) 
4  AND (30 > 40) 
5  AND (25 < 35); 

Tôi có quy trình i_value như tham số. Tôi cần bỏ qua dòng thứ 4 nếu i_value là 'S' và tôi cần bỏ qua dòng thứ 5 nếu i_value là 'T'.

Xin cảm ơn trước.

Trả lời

2

Tôi nghĩ rằng đây là cách tốt nhất để giải quyết vấn đề của bạn:

select * 
from dual 
where (1 = 1) 
     and (sysdate + 1 > sysdate) 
     and case 
      when i_value = 'S' 
       then 
       case 
        when (25 < 35) 
        then 1 
        else 0 
       end 
      when i_value = 'T' 
       then 
       case 
        when (30 > 40) 
        then 1 
        else 0 
       end 
      end = 1; 

Tất nhiên, bạn có thể sử dụng SQL động, nhưng nó muốn được nhiều khó khăn và kém hiệu quả.

1
SELECT * FROM dual 
WHERE (1 =1) 
AND (SYSDATE+1 > SYSDATE) 
AND CASE WHEN i_value = 'S' THEN 1 ELSE CASE WHEN (30 > 40) THEN 1 ELSE 0 END END = 1 
AND CASE WHEN i_value = 'T' THEN 1 ELSE CASE WHEN (25 < 35) THEN 1 ELSE 0 END END = 1; 
+1

Điều này sẽ không hoạt động như mong đợi. Bởi vì nếu i_value được chuyển thành 'S', thì dòng thứ 4 trong mã của bạn sẽ kết quả là 0 và điều kiện không thành công. vì vậy, toàn bộ đầu ra sẽ không có. Có một cái nhìn sâu sắc. – ajmalmhd04

+0

Rất tiếc - Tôi đã cập nhật nó để khắc phục sự cố. (Trước đây đã có "VÀ TRƯỜNG HỢP KHI i_value = 'S' THEN 0 ELSE ..." đã thay đổi 0 đến 1 trên cả dòng thứ 4 & thứ 5. –

+0

có giao diện một lần nữa;) – ajmalmhd04

1

Tại sao để ser sử dụng case?

SELECT * FROM dual 
    WHERE (1 =1) 
    AND (SYSDATE+1 > SYSDATE) 
    AND (((30 > 40) and i_value <> 'S') or i_value = 'S') 
    AND (((25 < 35) and i_value <> 'T') or i_value = 'T'); 
+0

Điều này tốt hơn. Nhưng không thích hợp với mã của tôi. (ở trên là một truy vấn mẫu mà tôi đã sử dụng từ một truy vấn lớn). Vì vậy, tôi đã sử dụng "nếu i_value = 'S' sau đó" phương pháp. Nếu không, tôi cần phải sử dụng một hardcoding lớn trên mỗi dòng. Cảm ơn – ajmalmhd04

-1

Điều này cũng hoạt động.

case 
    when (i_value = 'S' and (WHERE (1=1) AND (SYSDATE+1 > SYSDATE) AND (25 < 35))) then 1 
    when (i_value = 'T' and (WHERE (1=1) AND (SYSDATE+1 > SYSDATE) AND (30 < 40))) then 1 
    else 0 
end = 1 
Các vấn đề liên quan