【问题标题】:Oracle SQL sum sometimes return double valueOracle SQL sum 有时会返回双精度值
【发布时间】:2016-03-11 05:58:42
【问题描述】:

我在 Oracle 11 上使用 TOAD 时遇到了一个有趣的结果。相同的查询有时会返回正确的值,有时则不会。没有分组依据。没有加入。我错过了什么吗?

查询是将所有数字转换为数值,然后多个 3 或多个 1 取决于它们的位置,然后求和。

该字段定义为“device_id VARCHAR2(25);”

以下查询返回182,是正确值91的两倍。如果将条件更改为ii.device_id = '20637320050504',则正确值为67。

select sum(to_number(substr( ii. device_id, 1, 1 ))*3 +
               to_number(substr(ii. device_id, 13, 1 ))*3 + to_number(substr(ii. device_id, 12, 1 )) +
               to_number(substr(ii. device_id, 11, 1 ))*3 + to_number(substr(ii. device_id, 10, 1 )) +
               to_number(substr(ii. device_id, 9, 1 ))*3 + to_number(substr(ii. device_id, 8, 1 )) +
               to_number(substr(ii. device_id, 7, 1 ))*3 + to_number(substr(ii. device_id, 6, 1 )) +
               to_number(substr(ii. device_id, 5, 1 ))*3 + to_number(substr(ii. device_id, 4, 1 )) +
               to_number(substr(ii. device_id, 3, 1 ))*3 + to_number(substr(ii. device_id, 2, 1 )) ) as total
from identifier ii
where ii. device_id = '55019315060289'

我尝试从我的表定义中修改查询如下,结果是正确的。

select sum(to_number(substr( '55019315060289', 1, 1 ))*3 +
           to_number(substr('55019315060289', 13, 1 ))*3 +  to_number(substr('55019315060289', 12, 1 )) +
           to_number(substr('55019315060289', 11, 1 ))*3 +  to_number(substr('55019315060289', 10, 1 )) + 
           to_number(substr('55019315060289', 9, 1 ))*3 +   to_number(substr('55019315060289', 8, 1 )) +
           to_number(substr('55019315060289', 7, 1 ))*3 +   to_number(substr('55019315060289', 6, 1 )) +
           to_number(substr('55019315060289', 5, 1 ))*3 +   to_number(substr('55019315060289', 4, 1 )) +
           to_number(substr('55019315060289', 3, 1 ))*3 +   to_number(substr('55019315060289', 2, 1 )) ) as total 
from dual;

看起来这不是 TOAD 或 Oracle 问题,但我无法弄清楚我做错了什么。谢谢。

【问题讨论】:

  • 我会尝试 select ii. device_id from identifier ii where ii. device_id = '55019315060289' 并确认返回的行数或在执行 To_number 之前执行 SELECT DISTINCT。
  • 嗯,就是这个原因。请将其标记为答案,我会接受。非常感谢!

标签: sql oracle toad


【解决方案1】:

记下“数据类型可能支持的值范围”。无符号整数不能容纳55019315060289,无符号整数最大能容纳2147483647

【讨论】:

  • 我没有将值“55019315060289”转换为整数或无符号整数。我正在转换每个数字,所以上面是 5*3+5+0*3+1+9*3+3+1*3+5+0*3+6+0*3+2+8*3 = 91
  • 我使用的是 oracle 11g。我得到了输出 91
  • 感谢您告诉我。我正在使用 TOAD 访问 Oracle。让我更新描述。
猜你喜欢
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多