[英]CASE statement with IN in WHERE clause
我正在嘗試創建以下WHERE子句:
AND CASE @SomePRarmeter
WHEN 'this' THEN
user_id IN (SELECT * FROM dbo.func_Id1(@User))
WHEN 'that' THEN
user_id IN (SELECT user_id from dbo.func_Ids2(@OrgsForReporter)
END
但是我收到一個錯誤:關鍵字“IN”附近的語法不正確(在第一個條件中),盡管這兩個條件都有效。 使這樣的陳述有效的正確方法是什么?
謝謝!
嘗試
AND (
(@SomePRarmeter = 'this' AND user_id IN (SELECT * FROM dbo.func_Id1(@User)))
OR
(@SomePRarmeter = 'that' AND user_id IN user_id IN (SELECT user_id from dbo.func_Ids2(@OrgsForReporter)))
)
你在子查詢中做select *。 您只需要返回一列:
(SELECT * FROM dbo.func_Id1(@User))
對此:
(SELECT YOUR_USER_ID_COLUMN FROM dbo.func_Id1(@User))
case語句必須產生值,而不是表達式。 所以這不起作用:
select case when 1=1 then 1 in (1,2,3) end
但這會奏效;
select case when 1=1 then 1 end
該值可以是子查詢的結果。 因此,一種解決方案是重寫where
子句,如:
CASE @SomePRarmeter
WHEN 'this' THEN
(SELECT count() FROM dbo.func_Id1(@User) f where f.user_id = t.user_id))
WHEN 'that' THEN
(SELECT count() from dbo.func_Ids2(@OrgsForReporter) f where f.user_id = t.user_id))
END > 1
現在它返回匹配行的數量。 然后,您可以使用case ... end > 1
進行過濾。
我打破了這個:
IF 'this'
SELECT
...
WHERE user_id IN (SELECT * FROM dbo.func_Id1(@User))
ELSE IF 'that'
SELECT
...
WHERE user_id IN (SELECT user_id from dbo.func_Ids2(@OrgsForReporter))
CASE ... END
返回一個表達式,而不是一段文字SQL代碼。 而不是:
AND CASE foo WHEN bar THEN bla=ble END -- Wrong
......你必須使用這個:
AND bla = CASE foo WHEN bar THEN ble END -- Right
在您的情況下,您可以在此行上執行某些操作:
-- Untested
AND (
(@SomePRarmeter='this' AND user_id IN (SELECT * FROM dbo.func_Id1(@User)))
OR (@SomePRarmeter='that' AND user_id IN (SELECT user_id from bo.func_Ids2(@OrgsForReporter))
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.