2012-06-04 85 views
1

我想通过一个报表参数传递给存储过程(@Time)来指定哪些类别值在我的数据集中通过WHERE子句返回并且不知道语法来完成此操作正确。我怀疑一个案例/如果将需要使用,我已经做过,但不是当需要做一个WHERE子句IN。WHERE子句的SQL案例IN

DECLARE @Time AS NVARCHAR 
SET @Time = 'REG' --possible values of 'REG' and 'OT' 

SELECT 
f.[Category] AS [Category] 

FROM foo f 

WHERE 
@Time = 
    CASE @Time 
    WHEN 'REG' THEN f.[Category] IN (A, B, C, D) 
    WHEN 'OT' THEN f.[Category] IN (E, F, G) 
END 

回答

0

首先,当你声明一个字符变量,你应该始终包括长度。所以,你声明@Time是一个字符。我想你想要3个字符。

其次,当你声明一个nvarchar()变量时,给它分配一个nvarchar()。语法是N'Reg'而不是'Reg'。

三,什么是IN列表?你打算将这些数据作为常量或列吗?

最后,你想要的WHERE子句是一样的东西:

WHERE (CASE WHEN @Time ='REG' and f.[Category] IN (A, B, C, D) then 'true' 
      WHEN @Time ='OT' THEN f.[Category] IN (E, F, G) then 'true' 
      else 'false' 
     end) = 'true' 
+0

谢谢,这是我需要的! – Haymak3r

1
SELECT f.[Category] AS [Category] 
FROM foo f 
WHERE (@Time = 'REG' and f.[Category] IN (A, B, C, D)) 
    or (@Time = 'OT' and f.[Category] IN (E, F, G)) 
2

您可以使用OR更换CASE一些查询的限制是这样的:

DECLARE @Time AS NVARCHAR(3) 
SET @Time = 'REG' --possible values of 'OT' and 'REG' 

SELECT 
f.[Category] AS [Category] 

FROM foo f 

WHERE (@Time = 'REG' and f.[Category] IN (A, B, C, D)) 
    OR (@Time = 'OT' and f.[Category] IN (E, F, G)) 

END