2012-11-01 30 views
15

Tôi cần sử dụng nếu câu lệnh bên trong mệnh đề where in sql.Làm thế nào để sử dụng nếu tuyên bố trong trường hợp khoản trong SQL?

Select * from Customer 
WHERE ([email protected] OR @ISClose is NULL) 
AND  
(C.FirstName like '%'[email protected]+'%' or @ClientName is NULL)  
AND 
if (@Value=2) 
    begin 
    ([email protected] or @Total is NULL)  
    end 
else if(@Value=3) 
begin 
(I.RecurringCharge like '%'+cast(@Total as varchar(50))+'%' or @Total is NULL) 
end 

Lưu ý: Đây không phải là mã hoàn chỉnh.Điều gì được xác định trong SP.I Chỉ cần viết mã cần thiết để hiểu vấn đề.

Xin cảm ơn trước.

Trả lời

6

Bạn phải sử dụng CASE Statement/Expression

Select * from Customer 
WHERE ([email protected] OR @ISClose is NULL) 
AND  
    (C.FirstName like '%'[email protected]+'%' or @ClientName is NULL)  
AND 
    CASE @Value 
     WHEN 2 THEN (CASE I.RecurringCharge WHEN @Total or @Total is NULL) 
     WHEN 3 THEN (CASE WHEN I.RecurringCharge like 
           '%'+cast(@Total as varchar(50))+'%' 
        or @Total is NULL) 
    END 
+0

tôi đã cố gắng cùng nhưng tôi đã cho tôi lỗi "không đúng cú pháp gần '='" trên dòng này khi 1 sau đó ([email protected] hoặc @Tổng số là NULL) –

+0

Vâng nó đang đưa ra lỗi tại cùng một vị trí .i đã thực hiện nó trong SP ban đầu của tôi. –

+0

không thể hiểu những gì là sai gần "=". Btw Cảm ơn. –

2

nĐể chắc chắn RDBMS bạn đang sử dụng, nhưng nếu nó là SQL Server bạn có thể nhìn vào thay vì sử dụng một CASE statement

đánh giá một danh sách các điều kiện và trả về một trong nhiều biểu kết quả tốt.

biểu

các trường hợp có hai định dạng:

Khái niệm CASE đơn giản so sánh một biểu thức để một bộ biểu thức đơn giản để xác định kết quả.

Biểu thức CASE được tìm kiếm đánh giá một tập hợp các biểu thức Boolean thành xác định kết quả.

Cả hai định dạng đều hỗ trợ đối số ELSE tùy chọn.

+0

Tôi đang sử dụng SQL Server –

+0

Sau đó, chứ không phải nhìn vào cách sử dụng một lệnh CASE –

9
SELECT * 
    FROM Customer 
WHERE ([email protected] OR @ISClose is NULL) 
    AND (C.FirstName like '%'[email protected]+'%' or @ClientName is NULL)  
    AND (isnull(@Value,1) <> 2 
     OR I.RecurringCharge = @Total 
     OR @Total is NULL)  
    AND (isnull(@Value,2) <> 3 
     OR I.RecurringCharge like '%'+cast(@Total as varchar(50))+'%' 
     OR @Total is NULL) 

Về cơ bản, tình trạng của bạn là

if (@Value=2) 
    TEST FOR => ([email protected] or @Total is NULL)  

lật xung quanh,

AND (isnull(@Value,1) <> 2    -- A 
     OR I.RecurringCharge = @Total -- B 
     OR @Total is NULL)    -- C 

Khi (A) là đúng, tức là @value là không 2, [ A hoặc B hoặc C] sẽ trở thành TRUE bất kể kết quả B và C là gì. B và C trong thực tế chỉ được kiểm tra khi @Value = 2, đó là ý định ban đầu.

0
select * from xyz where (1=(CASE WHEN @AnnualFeeType = 'All' THEN 1 ELSE 0 END) OR AnnualFeeType = @AnnualFeeType) 
Các vấn đề liên quan