SQL查询条件在where子句中

时间:2017-10-09 04:43:13

标签: sql

我编写了一个像

这样的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)

enter image description here

2 个答案:

答案 0 :(得分:2)

here

它不起作用,因为您在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的成本大于列表的大小。如果真的需要,请把它放回去。