【问题标题】:SQL Query with condition in where clause在 where 子句中带有条件的 SQL 查询
【发布时间】:2017-10-09 13:46:17
【问题描述】:

我写了一个类似的 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 那么它会给我 error

“子查询返回超过 1 个值。当子查询跟在 =, !=,...... 之后,这是不允许的”

但我在 where 条件下使用“TypeID IN”,因为“从 AuditID=57 的 TrnChecklist 中选择不同的 TypeID”返回多个值

我的数据样本(在 TrnChecklist 表中。其他列很少,但我只使用这 2 个)

【问题讨论】:

  • 您使用的是哪个数据库?
  • 您收到多行错误,因为(从 TrnChecklist 中选择不同的 TypeID,其中 AuditID=57)。

标签: sql


【解决方案1】:

CASE expression evaluates a list of conditions and returns one of multiple possible result expressions.

它不起作用,因为您在 CASE 表达式中每次评估都返回多个值,而 CASE 表达式预计每次评估都会返回一个标量值。

如果您将大小写放在表格数据上,it evaluates each row to return a value per row

您可以在此处使用此查询

SELECT TypeID FROM TrnChecklist WHERE TypeID IN 
(SELECT TypeID FROM TrnChecklist 
WHERE AuditID=57 AND (@TypeID IS NULL OR @TypeID = '') 
UNION SELECT @TypeID)

【讨论】:

  • 正是我的想法。也许是UNION ALL,但没什么大不了的。
【解决方案2】:

I 尝试在 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。通常 distinct 的成本大于 in 列表的大小。如果确实需要,请将其放回去。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多