2013-10-09 99 views
14

是否可以使用的情况哪里在子句? 事情是这样的:SQL在WHERE IN子句中使用CASE语句

DECLARE @Status VARCHAR(50); 
SET @Status='published'; 

SELECT * FROM Product P  
WHERE P.Status IN (CASE WHEN @Status='published' THEN (1,3) 
            WHEN @Status='standby' THEN (2,5,9,6) 
            WHEN @Status='deleted' THEN (4,5,8,10) 
            ELSE (1,3) 
            END) 

此代码提供了错误:附近有语法错误 ''。

+0

P.Status是什么类型? –

+0

你可以在'where'中使用'case',但不是那样。 'Case'必须为每个语句返回一个值。 –

+0

@MaryamArshi:P.Status的类型是int。 – POIR

回答

20

不,你不能使用casein这样。但是你可以做

SELECT * FROM Product P  
WHERE @Status='published' and P.Status IN (1,3) 
or @Status='standby' and P.Status IN (2,5,9,6) 
or @Status='deleted' and P.Status IN (4,5,8,10) 
or P.Status IN (1,3) 

BTW,你可以减少到

SELECT * FROM Product P  
WHERE @Status='standby' and P.Status IN (2,5,9,6) 
or @Status='deleted' and P.Status IN (4,5,8,10) 
or P.Status IN (1,3) 

因为or P.Status IN (1,3)给你也这已经回答了@Status='published' and P.Status IN (1,3)

+2

你是否需要围绕每个“或”子句使用括号?例如。或者(@ Status ='standby'和P.Status IN(2,5,9,6)) – dcp

+4

不要以为你需要圆括号,但最后的'或'语句会返回错误的结果......看到这个小提琴 - 第2条记录不应该返回。 http://sqlfiddle.com/#!3/9aef0/6 – sgeddes

9

我认识的所有记录,但有一个轻微的问题与接受的解决方案。它会返回误报。很容易解决:不需要

SELECT * FROM Products P  
WHERE (@Status='published' and P.Status IN (1,3)) 
    or (@Status='standby' and P.Status IN (2,5,9,6)) 
    or (@Status='deleted' and P.Status IN (4,5,8,10)) 
    or (@Status not in ('published','standby','deleted') and P.Status IN (1,2)) 

括号(尽管也许更容易,为什么我列入他们因此读取)。

1
select * from Tran_LibraryBooksTrans LBT left join 
Tran_LibraryIssuedBooks LIB ON case WHEN LBT.IssuedTo='SN' AND 
LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 when LBT.IssuedTo='SM' 
AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 WHEN 
LBT.IssuedTo='BO' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 
ELSE 0 END`enter code here`select * from Tran_LibraryBooksTrans LBT 
left join Tran_LibraryIssuedBooks LIB ON case WHEN LBT.IssuedTo='SN' 
AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 when 
LBT.IssuedTo='SM' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 
WHEN LBT.IssuedTo='BO' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 
1 ELSE 0 END 
1

SELECT * FROM Tran_LibraryBooksTrans LBT左加入 Tran_LibraryIssuedBooks LIB ON情况下,当LBT.IssuedTo = 'SN' AND LBT.LIBRARYTRANSID = LIB.LIBRARYTRANSID THEN 1时LBT.IssuedTo = 'SM' AND LBT.LIBRARYTRANSID = LIB.LIBRARYTRANSID THEN 1 WHEN LBT.IssuedTo = 'BO' AND LBT.LIBRARYTRANSID = LIB.LIBRARYTRANSID THEN 1 ELSE 0 END

1

也许你可以试试这个方法

SELECT * FROM Product P WHERE (CASE WHEN @Status = 'published' THEN (CASE WHEN P.Status IN (1, 3) THEN 'TRUE' ELSE FALSE END) WHEN @Status = 'standby' THEN (CASE WHEN P.Status IN (2, 5, 9, 6) THEN 'TRUE' ELSE 'FALSE' END) WHEN @Status = 'deleted' THEN (CASE WHEN P.Status IN (4, 5, 8, 10) THEN 'TRUE' ELSE 'FALSE' END) ELSE (CASE WHEN P.Status IN (1, 3) THEN 'TRUE' ELSE 'FALSE' END) END) = 'TRUE'

这样,如果@Status =“出版”,查询将检查是否P.Status是其中1或3,它将返回TRUE,否则“假”。这将TRUE在年底

希望它有助于匹配。

1

我相信你可以在where子句中使用case语句,这里是我如何做到这一点:

Select 
ProductID 
OrderNo, 
OrderType, 
OrderLineNo 
From Order_Detail 
Where ProductID in (
Select Case when (@Varibale1 != '') 
then (Select ProductID from Product P Where .......) 
Else (Select ProductID from Product) 
End as ProductID 
) 

这种方法已经为我工作一次又一次。尝试一下!