2012-06-04 83 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