簡體   English   中英

在WHERE子句中使用IN的CASE語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM