在SQL中用IF语句替换CASE语句

4

最近,我被分配负责对一个在我到来之前编写的项目进行一些重大的重构工作。其中一部分重构涉及浏览一些存储过程并对它们进行清理,并对它们的行为进行一些一般性的更改。最近我遇到了以下声明:

IF 
CASE 
    WHEN EXISTS 
       (
          SELECT *
          FROM users
          WHERE Username = 'admin'
       ) THEN 1
    ELSE 0
END <> 0
//Do something here

经过一段时间的观察和一些调查研究,我最终得出的结论是,上述代码的逻辑可以通过以下方式实现:
IF EXISTS (
          SELECT *
          FROM users
          WHERE Username = 'admin'
       )
//Do something here
所以我的问题是:使用case语句有什么优势呢?相比if语句,它似乎更加臃肿且难读懂。我是否错了,这两个查询是等价的,是否存在它们会有不同行为的情况?

顺便说一下,我并不特别关注在使用case语句而不是if语句的性能优势。但是对于那些在寻找这方面信息的人,这里有一个很好的回答

如果您需要添加其他条件以返回其他结果,则case语句将是更优选的选项。如果您只检查单个存在,就像第二个示例中一样,那么这是更好的方法。我完全同意您的看法。 - Tanner_Gram
我认为这里真正的问题是TSQL中的IF语句是否有快捷方式。如果它们有快捷方式,那么IF()OR()OR()与CASE一样优化。我们知道CASE在第一个检查时就会快速跳过。我想把这个发表在答案中,但我实际上不确定TSQL是如何处理的。我认为你可以用一个插入值并返回true的函数进行简单的测试,然后用不同的参数运行两次,看看是否都被插入。显然,对于一个要测试的条件,这并不重要。 - woot
2个回答

1

如果可以假设在相对短的时间内需要多个条件,则可维护性就非常重要。

这基本上是我能想到的唯一原因 ;)


我认为第二个更容易维护。 - Yuriy Galanter
不,如果你能够预见到10或20种不同的情况出现,就不要使用IF语句。IF序列更难维护(更容易出现else条件错误)。 - TomTom
啊,对啊,我没想到要再加上额外的条件。虽然说,如果我保留那个奇怪的 case 语句,那么任何我交接代码的人都会跟我当初一样感到困惑!既然我觉得没有必要再增加新的 case,我已经将它改成了 IF 语句。谢谢你们俩! - ControlAltDeplete

0

这里有一些评论中的错误信息。幸运的是,你已经将它改成了“IF”语句,但对于未来的页面浏览者:

  1. 请参见@damien-the-unbeliever在此问题上的第一个评论:MS SQL - CASE vs IF performance

  2. 请参见论坛主题(仅前几篇帖子):http://www.sqlservercentral.com/Forums/Topic1206250-392-1.aspx

基本上,IF/ELSE 语句CASE 表达式是语言中两个根本不同的部分,不能互换使用。IF/ELSE用于批处理或存储过程中的控制流;CASE用于在SELECT或类似操作中“选择”数据值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接