Sql 带有IN-WHERE子句的CASE语句

Sql 带有IN-WHERE子句的CASE语句,sql,tsql,where-clause,Sql,Tsql,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”附近的语法不正确,尽管这两个条件分别起作用。怎样才能使这

我正在尝试创建以下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”附近的语法不正确,尽管这两个条件分别起作用。怎样才能使这样一种说法起作用呢


谢谢

您正在子查询中执行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。。。结束>1。

试试看

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)))
)
我要说:

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)) 
案例。。。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))
)

您是否尝试过在第3行和第5行的周围加上括号?就像在dbo.func的SELECT*中的-user_id一样_getReportsToUserId@User? 它也不起作用,给了我同样的错误关于在,然后关于我最后的评论。THEN子句需要一个值。IN表达式的计算结果不是值。返回表有一列,我将其更改为名称,但这无助于查询太大,我不想因为这个子句而重写它,但感谢您的建议。+1比复杂的情况好得多!也许可以将select*更改为select user_id,尽管如果函数只返回一列,这应该无关紧要