我有查询,其中我有一个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)
如果我只传递了一个值,那么它可以正常工作,但是如果还有更多它会中断
提前致谢
答案 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);