当我使用这个陈述时;
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语句只返回一个值,忽略它可以返回多个值的情况,这种情况不属于这个问题的范围。
答案 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_expr
是WHEN NAME = 'a'
部分,如果手册正确,如果select
具有不同的值,则数据库将无法运行name
。