我需要一些有关SQL中搜索 CASE WHEN
语句的处理顺序的信息。
例如:
(CASE
WHEN Cells.Type <> 'UOM' THEN 0
WHEN Template_Colors.Uom_Case = 'ONE' THEN 1
WHEN Template_Colors.Uom_Case = 'MUL' THEN 2
END) AS CELL_WHAT_UOM
我需要结果始终为0
,除非Cells.Type <> 'UOM'
。
我知道SQL解析器通常从底部到顶部,但在Oracle中,查询似乎工作正常,所以我认为WHEN
子句按它们的顺序处理。
100%保证 0
案例是否先于其他案件处理?
或者我强制写道:
(CASE
WHEN Cells.Type <> 'UOM' THEN 0
WHEN Cells.Type = 'UOM' AND Template_Colors.Uom_Case = 'ONE' THEN 1
WHEN Cells.Type = 'UOM' AND Template_Colors.Uom_Case = 'MUL' THEN 2
END) AS CELL_WHAT_UOM
...
我需要有关Oracle 10g + SQL server 2008 r2 + Postgre的信息。
答案 0 :(得分:5)
如果Cells.Type
不等于UOM
,则保证结果为0。
保证(当然在SQL Server中)保证的是,其他分支中的任何表达式都不会被计算。
所以,如果你做了以下事情:
CASE WHEN a = 0 THEN 0 ELSE 10/a END
你可能会得到零误差除法。
而且,即使在你的例子中:
WHEN Cells.Type = 'UOM' AND Template_Colors.Uom_Case = 'ONE' THEN ...
在评估谓词的顺序上有 no 保证,因此仍可以访问Template_Colors.Uom_Case
。不确定您是否关注此列是否受到关注,因此目前无法提供进一步的建议。
按照指定的顺序评估每个
WHEN
子句的 Boolean_expression 。返回评估为
TRUE
的第一个 Boolean_expression 的 result_expression 。如果没有 Boolean_expression 计算为
TRUE
,则如果指定了ELSE
子句,则数据库引擎返回 else_result_expression ,或者如果未指定NULL
子句,则为ELSE
值。
在搜索的
CASE
表达式中,Oracle从左到右搜索,直到找到 condition 的出现为真,然后返回 return_expr 。如果未发现 condition 为真,并且存在ELSE
子句,则Oracle返回 else_expr 。否则,Oracle返回null
。
如果结果为true,则
CASE
表达式的值是条件后面的结果。如果结果为false,则以相同的方式搜索任何后续WHEN
子句。
如果某个
<search condition>
的{{1}} 一个<searched when clause>
为真,那么<case specification>
的值就是第一个<case specification>
的值 (最左边)<result>
<searched when clause>
true,强制转换为<search condition>
的数据类型。