【问题标题】:Assigning multiple results from CASE to WHERE col IN将多个结果从 CASE 分配到 WHERE col IN
【发布时间】:2015-05-07 16:24:13
【问题描述】:

我在使用案例时收到此消息,我不想让表达式检查 id 是否为空,这将是不必要的额外代码。

子查询返回超过 1 个值。这是不允许的,当 子查询遵循 =、!=、、>= 或当子查询用作 一个表达式。

declare @idchar(2)
set @id= ''

select names from Units
where id in(    
    case @id
        when '' then (select id from Units)
        else @id
    end
)

【问题讨论】:

  • 嗯,当然。您将子查询用作表达式,它只允许您获得一个结果。你的问题是什么,你想做什么?
  • @Luaan 我希望用户通过组合框搜索特定 id 或搜索全部(id 为''时的情况)
  • 是的,你根本不需要子查询 :)

标签: sql-server case


【解决方案1】:

您可以按如下方式重写您的查询:

select names from Units
where (@id = '' AND id in(select id from Units)) OR id = @id

在这种情况下,如果 @id'',则评估条件 id in(select id from Units)。但是,如果 @id 具有任何其他值,则评估条件 id = @id。这假定@id 不能有值NULL

编辑: 在查看查询之后,似乎查询可以简化很多。您根本不需要 IN 部分,因为您正在尝试访问同一个表中的所有记录,因此您可以使用更简单的查询:

select names from Units
where @id = '' OR id = @id

【讨论】:

  • 我会使用括号来确保表达式的计算方式很明显 ((A and B) or C)。
  • @Luaan 是的,你是对的——功能上是一样的,但更好的可读性总是有帮助的。我更新了答案
  • @dotnetom 这确实有效,但现在我只有一个疑问:是否推荐这种方式?或者更好的是,我有一个单独的存储过程来搜索所有 id,因为查询很长
  • @WeaponX 在您提出问题之后,您似乎不需要使用 IN 部分,简化查询将为您提供相同的结果。我不认为有单独的程序来获得所有结果会给你带来很多性能优势
【解决方案2】:

假设您永远不必处理空值,则可以这样做:

SELECT names
 from Units
 where (id = @Id or (isnull(@Id, '') = ''))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 2012-03-12
    • 2020-09-13
    • 1970-01-01
    • 2010-11-07
    • 2017-04-16
    • 1970-01-01
    相关资源
    最近更新 更多