SQL case-when-else 语句效率

SQL case-when-else statement efficiency

当我使用这个语句时;

UPDATE TABLE
   SET FIELD = CASE
               WHEN NAME = 'a' THEN (SELECT NO FROM TABLE_TWO WHERE NAME = 'a')
               ELSE 'x' END
 WHERE FIELD_TWO = 1

if TABLE.NAME != 'a' select SQL 会执行吗? 此外,还有一个额外的问题,您认为在任何给定产品的 SQL 代码中包含这样的逻辑是否合适?我认为 SQL 中的任何逻辑都会使其覆盖变得非常困难,并且难以维护,您怎么看?

编辑:select只声明return一个值,忽略可以return多个值的情况,这种情况不在本题范围内。

我认为将它拆分成两个像这样的更新语句会更容易阅读和维护:

UPDATE TABLE SET FIELD = (SELECT TOP 1 NO FROM TABLE_TWO WHERE NAME = 'a')
            WHERE FIELD_TWO = 1
              AND NAME='a'
UPDATE TABLE SET FIELD = 'x' 
            WHERE FIELD_TWO = 1
            AND NAME != 'a'

它可以让您轻松添加更多案例,如果有更多案例,您可以概括这些案例,例如:

UPDATE TABLE SET FIELD = (SELECT TOP 1 NO FROM TABLE_TWO WHERE NAME = TABLE.FIELD)
            WHERE FIELD_TWO = 1
              AND NAME IN ('a','b','c')

如果我是你,我会使用一个变量,这样 case 就不会每次都计算标量值。类似以下内容:

DECLARE @myVar VARCHAR(10);

SELECT TOP 1 @myVar = NO FROM TABLE_TWO WHERE NAME = 'a';

UPDATE TABLE
   SET FIELD = CASE
               WHEN NAME = 'a' THEN @myVar
               ELSE 'x' END
 WHERE FIELD_TWO = 1

The Oracle manual 声称它确实 短路评估:

Oracle Database uses short-circuit evaluation. For a simple CASE expression, the database evaluates each comparison_expr value only before comparing it to expr, rather than evaluating all comparison_expr values before comparing any of them with expr

在你的情况下 comparison_exprWHEN NAME = 'a' 部分,如果手册是正确的,数据库将不会 运行 如果 nameselect不同的值。