繁体   English   中英

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

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

编辑:select语句仅返回一个值,忽略可以返回多个值的情况,这种情况不在此问题的范围内。

我认为将其拆分为两个这样的UPDATE语句时,将更易于阅读和维护:

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')

如果您是我,我将使用一个变量,这样该情况就不会每次都计算标量值。 如下所示:

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

Oracle手册声称它进行短路评估:

Oracle数据库使用短路评估 对于一个简单的CASE表达式,数据库仅在将每个comparison_expr值与expr进行comparison_expr之前才对其求值,而不是在将所有compare_expr值与expr进行比较之前对其求值

你的情况comparison_exprWHEN NAME = 'a'部分,如果人工是正确的,该数据库将无法运行的select ,如果name有不同的价值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM