T-SQL IN子句与案例陈述相结合

时间:2015-05-25 14:10:12

标签: sql sql-server tsql

我有查询,其中我有一个in子句结合case语句。 我得到的错误是:

  

子查询返回的值超过1。这是不允许的   子查询跟随=,!=,<,< =,>,> =或当子查询用作   表达。

我在存储过程中收到一个像这样的连接varchar值' 2,3,4,5'我想在我的查询中使用in子句过滤id 但我缺少的东西

有人可以帮我这个忙吗?

libc::free

然后在查询中

@ids varchar(50) = '2,3,4'

DECLARE @mylist TABLE (Id int)
INSERT INTO @mylist
select CONVERT(INT,v) from [dbo].[SplitString](@cardtypes)

//result of @mylist
//-------------------
//2
//3
//4

注意: ctable.Id(INT)

如果我只传递了一个值,那么它可以正常工作,但是如果还有更多它会中断

提前致谢

2 个答案:

答案 0 :(得分:4)

您尝试在一个ctable.Id语句中混合使用标量值select id from @mylist和一些结果集case

这不能做,但您可以像这样重写您的查询:

select * from mytable
where
    (isnull(@ids,'') <> '' and ctable.Id in (select id from @mylist))
    or isnull(@ids,'') = ''

答案 1 :(得分:3)

出于好奇,你为什么要使用临时桌子?您可以将其表达为CTE:

with values as (
      select CONVERT(INT, v)
      from [dbo].[SplitString](@cardtypes)
     )
select t.*
from <table> t
where t.id in (select v from values) or
      not exists (select 1 from values);