1

我正在尝试将报告参数传递给存储过程 (@Time) 以指示通过 WHERE 子句在我的数据集中返回哪些类别值,并且不知道正确完成此操作的语法。我怀疑需要使用 case/if 并且我之前已经这样做过,但在需要执行 WHERE 子句时不需要。

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
4

3 回答 3

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
于 2012-06-04T14:56:44.520 回答
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))
于 2012-06-04T14:54:03.677 回答
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'
于 2012-06-04T14:56:12.600 回答