我正在尝试将报告参数传递给存储过程(@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
答案 0 :(得分: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
答案 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'