我编写了一个像
这样的SQL查询DECLARE @TypeID BIGINT
--SET @TypeID=169
SELECT TypeID from TrnChecklist where TypeID IN
(CASE WHEN (@TypeID IS NOT NULL AND @TypeID <> '') THEN @TypeID
ELSE (select distinct TypeID from TrnChecklist where AuditID=57) END)
如果我提供@TypeID,它会给我记录。但如果我不提供@TypeID,那么它会给我错误
“子查询返回的值超过1。当子查询跟随=,!=,......时,不允许这样做。”
但我在条件中使用“TypeID IN”,因为“从TrnChecklist中选择不同的TypeID,其中AuditID = 57”会返回多个值
我的数据样本(在TrnChecklist表中。很少有其他列,但我只使用这些2)
答案 0 :(得分:2)
它不起作用,因为您在CASE表达式中为每个评估返回多个值,该表达式应该返回每个评估的标量值。
如果您将案例放在表格数据上CASE expression evaluates a list of conditions and returns one of multiple possible result expressions.。
您可以在此处使用此查询
SELECT TypeID FROM TrnChecklist WHERE TypeID IN
(SELECT TypeID FROM TrnChecklist
WHERE AuditID=57 AND (@TypeID IS NULL OR @TypeID = '')
UNION SELECT @TypeID)
答案 1 :(得分:1)
我试图在IN()中使用case表达式不太可行。尝试使用布尔逻辑。您需要按参数指定的值,或者您希望IN()列表匹配。
DECLARE @TypeID bigint
--SET @TypeID=169
SELECT
TypeID
FROM TrnChecklist
WHERE (TypeID = @TypeID AND @TypeID IS NOT NULL AND @TypeID <> '')
OR ( NOT (TypeID = @TypeID AND @TypeID IS NOT NULL AND @TypeID <> '')
AND TypeID IN (SELECT DTypeID
FROM TrnChecklist
WHERE AuditID = 57)
)
可能仍有一些条件仍然可以从上面的查询中删除,但我认为它会起作用。
注意,我删除了不同的内容。通常,distinct的成本大于列表的大小。如果真的需要,请把它放回去。