2

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

4

1 回答 1

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 ...

无法保证评估谓词的顺序,因此Template_Colors.Uom_Case仍然可以访问。不确定您对是否访问此列有什么顾虑,因此目前不提供进一步的建议。


SQL Server 文档

  • 按指定的顺序计算每个子句的Boolean_expression 。WHEN

  • 返回计算结果为 的第一个Boolean_expression的result_expressionTRUE

  • 如果没有Boolean_expression计算结果为TRUE,则如果指定了子句,数据库引擎将返回else_result_expression ,如果未ELSE指定子句,则返回一个NULLELSE

甲骨文

在搜索CASE表达式中,Oracle 从左到右搜索,直到找到一个为真的条件,然后返回return_expr。如果没有发现条件为真,并且ELSE存在子句,则 Oracle 返回else_expr。否则,Oracle 返回null.

PostGre :

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

安西 92(草案)

如果a<search condition>中 some of为真,则 the 的值是第一个(最左边)为真的的值,转换为 的数据类型。<searched when clause><case specification><case specification><result><searched when clause><search condition><case specification>

于 2013-01-31T09:11:06.950 回答