我有一个存储过程,我在其中传递逗号分隔的id,我在where
子句中使用它,case语句带有'IN'。
我收到此错误:
'子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。'
我的程序是
ALTER Proc [dbo].[proc_generatdetail]
@TagIds varchar(1000)
@IsMinStock bit,
@Tags varchar(1000)
AS
BEGIN
SELECT
IMd.ItemCode, I.ITEM_No
FROM
Item I
LEFT JOIN
tblItemSize ITS ON I.ITEMCode = ITS.ItemId
AND I.BranchId = ITS.BranchId
WHERE
CASE
WHEN @Tags IS NOT null
THEN ITS.SizeId
ELSE 1 END IN
(case when @Tags is not null then (select id from CSVToTable(@TagIds)) else (1) end)
END
CSVToTabes
重写了id表,我不必使用if - else条件。
如果有人的话,请为此提供解决方案。
答案 0 :(得分:2)
这是您的查询:
select IMd.ItemCode, I.ITEM_No
from Item I left join
tblItemSize ITS
on I.ITEMCode = ITS.ItemId and
I.BranchId = ITS.BranchId
where case when @Tags IS NOT null
then ITS.SizeId else 1
END in (case when @Tags is not null then (select id from CSVToTable(@TagIds)) else (1) end)
case
语句必须为其所有条件返回相同的内容。并且,它不能返回一组。只需在没有case
的情况下重新编写逻辑:
select IMd.ItemCode, I.ITEM_No
from Item I left join
tblItemSize ITS
on I.ITEMCode = ITS.ItemId and
I.BranchId = ITS.BranchId
where (@Tags is null) or
(ITS.SizeId in (select id from CSVToTable(@TagIds))
逻辑也更容易理解。
有一种情况需要case
。也就是说,如果给定NULL
参数,函数将返回错误。然后您可以将其标记为:
where 1 = (case when @Tags is null then 1
when ITS.SizeId in (select id from CSVToTable(@TagIds) then 1
else 0
end)