Jac*_*las 6 oracle oracle-11g-r2
由于我对模型子句的理解有限,我希望以下三个查询返回相同的结果,因为数据中没有空值,并且函数是等效的:
select *
from (select level k, 100 v from dual connect by level<=2)
model return updated rows
dimension by (k)
measures (v, 0 shr)
rules ( shr[any] = v[cv()]/sum(v)[any] ); --plain sum
/*
K V SHR
---------- ---------- ----------
1 100 0.5
2 100 0.5
*/
select *
from (select level k, 100 v from dual connect by level<=2)
model return updated rows
dimension by (k)
measures (v, 0 shr)
rules ( shr[any] = v[cv()]/nullif(sum(v)[any],0) ); --with nullif
/*
K V SHR
---------- ---------- ----------
1 100 0.25 <------\___ why?
2 100 0.25 <------/
*/
select *
from (select level k, 100 v from dual connect by level<=2)
model return updated rows
dimension by (k)
measures (v, 0 shr)
rules ( shr[any] = v[cv()]/decode(sum(v)[any],0,null,sum(v)[any]) ); -- with decode
/*
K V SHR
---------- ---------- ----------
1 100 0.5
2 100 0.5
*/
Run Code Online (Sandbox Code Playgroud)
我在处理解释这种行为的规则时遗漏了什么?
SQLFiddle在这里
在Oracle Database SQL Language Reference 中可以阅读
NULLIF(expr1, expr2) ... NULLIF 函数在逻辑上等同于以下 CASE 表达式: CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
但是 Linux 上的 Oracle 11.2.0.3 给出了以下内容
SQL>选择* 2 from(选择第 k 级,100 v from dual connect by level<=2) 3 模型返回更新的行 4维乘(k) 5 小节 (v, 0 shr) 6 条规则( shr[any] = CASE WHEN sum(v)[any] = 0 THEN NULL ELSE sum(v)[any] END); KV SHR ---------- ---------- ---------- 1 100 200 2 100 200 SQL>选择* 2 from(选择第 k 级,100 v from dual connect by level<=2) 3 模型返回更新的行 4维乘(k) 5 小节 (v, 0 shr) 6 条规则 ( shr[any] = nullif(sum(v)[any], 0)); KV SHR ---------- ---------- ---------- 1 100 400 2 100 400 查询>
因此这是(至少是一个文档:-) 11r2 中的错误
在Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production 中获得相同的结果