2016-04-08 127 views
0

我试图在WHERE子句中使用CASE语句,但它不起作用。 任何帮助真的很感激,谢谢!SQL中的WHERE子句中的CASE语句

SELECT 
... 
FROM ... 
WHERE 
    CASE 
    WHEN @LastName <> '' AND @CardNo <> '' AND @StoreNo <> '' THEN 
     ((m.ApplicantLastName LIKE @LastName AND m.StoreNo = @StoreNo) OR 
     (m.CardNo LIKE @CardNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '')) 
    WHEN @LastName <> '' AND @CardNo <> '' THEN 
     (m.ApplicantLastName LIKE @LastName OR (m.CardNo LIKE @CardNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '')) 
    WHEN @LastName <> '' AND @StoreNo <> '' THEN 
     (m.ApplicantLastName LIKE @LastName AND m.StoreNo = @StoreNo) 
    WHEN @LastName <> '' THEN 
     m.ApplicantLastName LIKE @LastName 
    WHEN @CardNo <> '' THEN 
     (m.CardNo LIKE @CardNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '') 
    END 

回答

4

这是CASE的错误用法:

(m.CardNo LIKE @CardNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '') 

你不能用它来生成一个飞行谓词。您只能使用CASE来生成一个值,您可以将其与WHERE子句中的某些值进行比较。

0

你可以重写你的逻辑,而不case做这样的事情:

WHERE ((@LastName = '' AND LTRIM(RTRIM(m.ApplicantLastName)) <> '') OR 
     (m.ApplicantLastName LIKE @LastName) 
    ) AND 
     (@CardNo = '' OR m.CardNo LIKE @CardNo) AND 
     (@StoreNo = '' OR m.StoreNo = @StoreNo) 

注意,这个逻辑经常写假设NULL,而不是一个空字符串:

WHERE (@LastName IS NULL OR m.ApplicantLastName LIKE @LastName) AND 
     (@CardNo IS NULL OR m.CardNo LIKE @CardNo) AND 
     (@StoreNo IS NULL OR m.StoreNo = @StoreNo) 

而且,如果你在这些列上有索引,那么您可能需要考虑动态SQL,以便最终查询可以使用索引。

1

该参数可以在where子句中使用,因为它有字段组合成一个过滤器。

WHERE 
    (@CardNo='' OR m.CardNo LIKE @CardNo)  
    AND 
    (@LastName='' OR m.ApplicantLastName LIKE @LastName) 
    AND 
    (@StoreNo='' OR m.StoreNo = @StoreNo) 
    AND 
    (@CardNo='' OR LTRIM(RTRIM(m.ApplicantLastName)) <> '') 
0

我终于得到它具有以下工作:

SELECT 
... 
FROM ... 
WHERE 
    CASE 
    WHEN @LastName <> '' AND @BimartNo <> '' AND @StoreNo <> '' AND 
     ((m.ApplicantLastName LIKE @LastName AND m.StoreNo = @StoreNo) OR 
     (m.BimartNo LIKE @BimartNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '')) THEN 1 
    WHEN @LastName <> '' AND @BimartNo <> '' AND @StoreNo IS NULL AND 
     (m.ApplicantLastName LIKE @LastName OR (m.BimartNo LIKE @BimartNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '')) THEN 1 
    WHEN @LastName <> '' AND @StoreNo <> '' AND @BimartNo IS NULL AND 
     (m.ApplicantLastName LIKE @LastName AND m.StoreNo = @StoreNo) THEN 1 
    WHEN @LastName <> '' AND @BimartNo IS NULL AND @StoreNo IS NULL AND 
     m.ApplicantLastName LIKE @LastName THEN 1 
    WHEN @BimartNo <> '' AND @LastName IS NULL AND @StoreNo IS NULL AND 
     (m.BimartNo LIKE @BimartNo AND LTRIM(RTRIM(m.ApplicantLastName)) <> '') THEN 1 
    ELSE 0 
    END = 1 

我学到了什么,如果我们想要做的:

WHERE 
    IF A THEN X 
    ELSE IF B THEN Y 

在SQL中,这将是:

WHERE 
    CASE 
    WHEN A AND X THEN 1 
    WHEN B AND Y THEN 1 
    ELSE 0 
    END = 1 

Denis/lrb/Gordon:感谢所有y ou输入!