在处理订单时搜索CASE

时间:2013-01-31 09:08:23

标签: sql case-when

我需要一些有关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的信息。

1 个答案:

答案 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。不确定您是否关注此列是否受到关注,因此目前无法提供进一步的建议。


SQL Server documentation

  
      
  • 按照指定的顺序评估每个WHEN子句的 Boolean_expression

  •   
  • 返回评估为TRUE的第一个 Boolean_expression result_expression

  •   
  • 如果没有 Boolean_expression 计算为TRUE,则如果指定了ELSE子句,则数据库引擎返回 else_result_expression ,或者如果未指定NULL子句,则为ELSE值。

  •   

Oracle

  

在搜索的CASE表达式中,Oracle从左到右搜索,直到找到 condition 的出现为真,然后返回 return_expr 。如果未发现 condition 为真,并且存在ELSE子句,则Oracle返回 else_expr 。否则,Oracle返回null

PostGre

  

如果结果为true,则CASE表达式的值是条件后面的结果。如果结果为false,则以相同的方式搜索任何后续WHEN子句。

Ansi 92 (draft)

  

如果某个<search condition>的{​​{1}}                 一个<searched when clause>为真,那么<case specification>的值就是第一个<case specification>的值                 (最左边)<result> <searched when clause>                 true,强制转换为<search condition>的数据类型。