WHERE子句IN的SQL案例

时间:2012-06-04 14:50:28

标签: sql reporting-services

我正在尝试将报告参数传递给存储过程(@Time)以指示通过WHERE子句在我的数据集中返回哪些Category值,并且不知道正确完成此操作的语法。我怀疑是否需要使用case / if并且我之前已经完成了这项工作,但是在需要执行WHERE子句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

3 个答案:

答案 0 :(得分:2)

您可以使用ORCASE替换为以下某些查询限制:

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

答案 1 :(得分: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 :(得分: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'