2011-05-09 139 views
3

我有以下查询:where子句中的SQL Case语句指定条件?

SELECT * 
FROM dbo.tblOrders o 
WHERE o.OrderId IN (SELECT [Value] FROM [dbo].[udf_GenerateVarcharTableFromStringList](@OrderId, ',')) 
AND 
@ActiveInactive = 
CASE 
WHEN 'Active' THEN (o.[orderactivedate] > o.[orderinactivedate]) 
WHEN 'Inactive' THEN (o.[orderactivedate] < o.[orderinactivedate]) 
END 

这将返回

An expression of non-boolean type specified in a context where a condition is expected, near 'THEN'. 

我将如何得到这个工作?说如果该参数是'活动',然后按照以下标准返回记录?

+2

作为旁白...您需要关闭那个'Active'然后声明的parens。 – DKnight 2011-05-09 15:54:35

+0

添加了关闭的零部件 – davmos 2014-02-26 07:39:33

回答

7

你可以做的另一种方法:

SELECT * 
FROM dbo.tblOrders o 
WHERE o.OrderId IN (SELECT [Value] FROM [dbo].[udf_GenerateVarcharTableFromStringList](@OrderId, ',')) 
AND ((@ActiveInactive = 'Active' AND o.[orderactivedate] > o.[orderinactivedate]) 
OR (@ActiveInactive = 'Inactive' AND o.[orderactivedate] < o.[orderinactivedate])) 
1

你为什么不添加OR条件?像

SELECT... WHERE ... 
AND ((@ActiveInactive = 'Active' AND o.[orderactivedate] > o.[orderinactivedate]) OR 
    (@ActiveInactive = 'Inactive' AND o.[orderactivedate] < o.[orderinactivedate])) 
1

你不能有一个比较表达式在这样的

一个情况下,我会考虑这个选项,比较更改为正常表达

... 
AND 
CASE @ActiveInactive 
WHEN 'Active' THEN DATEDIFF(day, o.[orderinactivedate], o.[orderactivedate]) 
WHEN 'Inactive' THEN DATEDIFF(day, o.[orderactivedate], o.[orderinactivedate]) 
END > 0 

或者这一点,您可以在SIGN()表达有一个计算列

SIGN(DATEDIFF(day, o.[orderinactivedate], o.[orderactivedate])) = 
       CASE WHEN @ActiveInactive WHEN 'Active' THEN 1 WHEN 'InActive' THEN -1 END 
2
SELECT * 
FROM dbo.tblOrders o 
WHERE o.OrderId IN (SELECT [Value] FROM [dbo].[udf_GenerateVarcharTableFromStringList](@OrderId, ',')) 
AND 
@ActiveInactive = 
CASE 
WHEN (o.[orderactivedate] > o.[orderinactivedate]) then 'Active' 
WHEN (o.[orderactivedate] < o.[orderinactivedate]) THEN 'Inactive' 
END 
+0

请使用大括号按钮来格式化代码{}。否则,好想法 – gbn 2011-05-09 16:06:55