【问题标题】:How Oracle "row_limiting_clause" for rowcount| percent PERCENT rows works in Oracle 12c?Oracle 如何为 rowcount 设置“row_limiting_clause”|百分比 PERCENT 行在 Oracle 12c 中有效吗?
【发布时间】:2015-09-22 06:31:28
【问题描述】:

平台:Windows 7 x-64 数据库:Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit。

Oracle row_limiting_clause 如何计算行数| PERCENT 行的百分比适用于 Oracle 12c 吗?

Oracle row_limiting_clause 行为异常。 在下面的代码中,表“fetch_test”有 10 行

案例 1 当使用row_limiting_clause 获取前 0.5 行时,我只得到,

no rows selected 

案例 2 当仅对前 5% 行使用 row_limiting_clause 子句时,我得到 ​​p>

1 row as output.

案例 3 当仅对前 1% 行使用 row_limiting_clause 子句时,我得到 ​​p>

1 row as output.

这意味着案例 1!=案例 2 [0.5!=0.5(10 行的 5%)]

SQL> select * from fetch_test;

  COL1 COL2                                                                 
  ---- ----                                                           
     1 A                                                                    
     2 B                                                                    
     3 C                                                                    
     4 D                                                                    
     5 E                                                                    
     6 F                                                                    
     7 G                                                                    
     8 H                                                                    
     9 I                                                                    
    10 J                                                                    

10 rows selected.

案例一:

SQL> select col1 from fetch_test
  2  fetch first 0.5 rows only;

no rows selected

案例2:

SQL> select col1 from fetch_test
  2  fetch first 5 percent rows only;

  COL1                                                                      
  ----                                                                      
     1                                                                      

  1 row selected

案例3:

SQL> select col1 from fetch_test
2  fetch first 1 percent rows only;

COL1                                                                      
----                                                                      
   1  

 1 row selected    

Oracle 文档有什么要说的,

如果行数包括小数,则小数部分将被截断。如果 行数为 NULL,则返回 0 行 "source"

这解释了案例 1,但我在上面的示例中找不到案例 2 和 3 的可能解释。 任何帮助将不胜感激。

【问题讨论】:

  • 它可能会四舍五入以获得百分比的行数。文档很清楚,由于截断,0.5 被视为 0。所以,这两种情况根本不是一回事。
  • Thanks.Nice Guess,但我也认为,但在我发现的文档或文章中没有提到任何地方,百分比将被四舍五入。

标签: sql database oracle analytics oracle12c


【解决方案1】:

你的观察是正确的。严格阅读 Oracle 文档表明这种行为是正确的:

  • rowcount case 指定截断分数。

  • 没有提到百分比被截断。因此,假设百分比没有被截断是合理的。

这似乎是合理的,因为小数行数没有逻辑意义,但小数百分比确实有逻辑意义。

使用 rowcount 指定要返回的行数。 rowcount 必须是数字或计算结果为数值的表达式。如果指定负数,则 rowcount 被视为 0。如果 rowcount 大于从行偏移 + 1 开始的可用行数,则返回所有可用行。如果 rowcount 包含小数,则小数部分将被截断。如果 rowcount 为 NULL,则返回 0 行。

使用百分比 PERCENT 指定要返回的所选行总数的百分比。 percent 必须是一个数字或计算结果为数值的表达式。如果指定负数,则将百分比视为 0。如果百分比为 NULL,则返回 0 行。

http://docs.oracle.com/database/121/SQLRF/statements_10002.htm

对于这组特定的数字,我们可以观察到 Oracle 将 10 的 5% 舍入为 1。

> select 10*.05, round(10*.05) from dual;
10*.05 round(10*.05) 
------ ------------- 
   0.5             1 

更新,rishabi 注释:

根据http://community.oracle.com/message/13176927#13176927,余数(在行限制器中使用 PERCENT 时)将始终返回向上舍入的整数

【讨论】:

  • 这是一个由逻辑正确假设支持的答案。但是,我正在等待投票和其他答案将其标记为正确答案。
  • 听起来不错!无论哪种情况,我认为 oracle 都可以澄清他们的文档。
  • @MarkHarrison 。 . .不截断百分比 value 并不能解释为什么 10 行中的 5% = 1 行而不是 0。它可以解释为什么 5.5% 被视为 5% 或 6%。
  • @GordonLinoff,很好的观察。 10*.05 将四舍五入为 1,我已经相应地更新了答案。谢谢!
  • @MarkHarrison。它不会对百分比进行四舍五入。检查我更新的问题。对于案例 3,您将得到 SQL> select round(10*0.01) from dual; ROUND(10*0.01) -------------- 0
猜你喜欢
  • 2017-09-12
  • 2016-01-06
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2020-07-31
  • 2021-10-06
相关资源
最近更新 更多