[英]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_expr
是WHEN NAME = 'a'
部分,如果人工是正确的,该数据库将无法运行的select
,如果name
有不同的价值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.