当我用这句话;
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语句只返回一个值,忽略它可以返回多个值的情况,该情况不在此问题的范围内。
发布于 2016-06-14 05:48:53
Oracle手册声称它做短路评估:
Oracle数据库使用短路评估__.对于一个简单的
CASE表达式,数据库只在将每个comparison_expr值与expr__进行比较之前对其进行计算,而不是在将其与expr__进行比较之前对所有comparison_expr值进行计算。
在您的示例中,comparison_expr是WHEN NAME = 'a'部件,如果手册正确,数据库将不会运行select,如果name有不同的值。
发布于 2016-06-13 08:49:52
我认为,当您将它分成两个更新语句时,阅读和维护会更容易一些,比如:
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')发布于 2016-06-13 08:56:54
如果我是你,我会使用一个变量,这样就不会每次计算标量值。如下所示:
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 = 1https://stackoverflow.com/questions/37785084
复制相似问题