首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL case-when SQL语句效率

SQL case-when SQL语句效率
EN

Stack Overflow用户
提问于 2016-06-13 08:33:15
回答 3查看 428关注 0票数 0

当我用这句话;

代码语言:javascript
复制
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语句只返回一个值,忽略它可以返回多个值的情况,该情况不在此问题的范围内。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-14 05:48:53

Oracle手册声称它做短路评估:

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

在您的示例中,comparison_exprWHEN NAME = 'a'部件,如果手册正确,数据库将不会运行select,如果name有不同的值。

票数 1
EN

Stack Overflow用户

发布于 2016-06-13 08:49:52

我认为,当您将它分成两个更新语句时,阅读和维护会更容易一些,比如:

代码语言:javascript
复制
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'

它使您可以轻松地添加更多的案例,如果有更多的案例,您可以概括它们,例如:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-06-13 08:56:54

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37785084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档