SQL case-when-else语句效率

时间:2016-06-13 08:33:15

标签: sql oracle case-when

当我使用这个陈述时;

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'将执行选择的SQL吗? 此外,还有一个额外的问题,您认为在任何给定产品的SQL代码中使用这样的逻辑是否合适?我认为在SQL中有任何逻辑使得它的覆盖范围非常困难,并且很难维护,你怎么看?

编辑:select语句只返回一个值,忽略它可以返回多个值的情况,这种情况不属于这个问题的范围。

3 个答案:

答案 0 :(得分:1)

我认为当你将它分成两个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')

答案 1 :(得分:1)

如果我是你,我会使用一个变量,这样每次都不会计算标量值。如下所示:

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

答案 2 :(得分:1)

The Oracle manual声称它进行短路评估:

  

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

在您的情况下,comparison_exprWHEN NAME = 'a'部分,如果手册正确,如果select具有不同的值,则数据库将无法运行name