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
if TABLE.NAME != 'a'
select SQL 会执行吗?
此外,还有一个额外的问题,您认为在任何给定产品的 SQL 代码中包含这样的逻辑是否合适?我认为 SQL 中的任何逻辑都会使其覆盖变得非常困难,并且难以维护,您怎么看?
编辑:select只声明return一个值,忽略可以return多个值的情况,这种情况不在本题范围内。
我认为将它拆分成两个像这样的更新语句会更容易阅读和维护:
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')
如果我是你,我会使用一个变量,这样 case 就不会每次都计算标量值。类似以下内容:
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
The Oracle manual 声称它确实 短路评估:
Oracle Database uses short-circuit evaluation. For a simple CASE
expression, the database evaluates each comparison_expr
value only before comparing it to expr
, rather than evaluating all comparison_expr values before comparing any of them with expr
在你的情况下 comparison_expr
是 WHEN NAME = 'a'
部分,如果手册是正确的,数据库将不会 运行 如果 name
有 select
不同的值。
当我使用这个语句时;
UPDATE TABLE
SET FIELD = CASE
WHEN NAME = 'a' THEN (SELECT NO FROM TABLE_TWO WHERE NAME = 'a')
ELSE 'x' END
WHERE FIELD_TWO = 1
if TABLE.NAME != 'a'
select SQL 会执行吗?
此外,还有一个额外的问题,您认为在任何给定产品的 SQL 代码中包含这样的逻辑是否合适?我认为 SQL 中的任何逻辑都会使其覆盖变得非常困难,并且难以维护,您怎么看?
编辑:select只声明return一个值,忽略可以return多个值的情况,这种情况不在本题范围内。
我认为将它拆分成两个像这样的更新语句会更容易阅读和维护:
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')
如果我是你,我会使用一个变量,这样 case 就不会每次都计算标量值。类似以下内容:
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
The Oracle manual 声称它确实 短路评估:
Oracle Database uses short-circuit evaluation. For a simple
CASE
expression, the database evaluates eachcomparison_expr
value only before comparing it toexpr
, rather than evaluating all comparison_expr values before comparing any of them with expr
在你的情况下 comparison_expr
是 WHEN NAME = 'a'
部分,如果手册是正确的,数据库将不会 运行 如果 name
有 select
不同的值。