【问题标题】:Why oracle doesn't show the integer part of a decimal为什么oracle不显示小数的整数部分
【发布时间】:2015-09-09 15:31:22
【问题描述】:

当我执行下一条 SQL 时:

从对偶中选择 1/3;

结果是 ,333333333 但我预期的结果是 0,333333333

为什么 oracle 不显示零?有什么参数可以影响它吗? 谢谢

编辑:我从使用 oo4o(用于 ole 的 oracle 对象)的应用程序中检查了此行为,并通过 sqlDeveloper 确认(当我使用 F5 执行 sql,而不是使用 ctrl+intro 时)。真正的问题是 oo4o Dynaset 对象:当我尝试对两个字段的值求和时,我得到的是一个连接,而不是一个总和:,3 + ,2 = ,3,2. 我想知道是否有一些参数或配置使oracle引擎返回没有零的数字,所以我可以打开|关闭以将零作为整数部分返回。

【问题讨论】:

  • 在 PL/SQL Developer 中运行查询我得到 0.333333333333333。您使用什么工具来执行查询?

标签: oracle


【解决方案1】:

SQL*Plus 将默认显示(使用您所在地区的小数分隔符):

SQL> select 1/3 from dual;

       1/3
----------
.333333333

你可以使用set numformat 来改变行为:

SQL> set numformat "0D9999"
SQL> select 1/3 from dual;

    1/3
-------
 0.3333

... 其中 D 代表小数点分隔符。或者您可以使用列格式,以及列别名:

SQL> set numformat ""
SQL> column answer format 0.000
SQL> select 1/3 as answer from dual;

ANSWER
------
 0.333

其他客户端有不同的方式来控制默认输出; SQL Developer 的行为大致相同,但 PL/SQL Developer、Toad 等可能不会。

或者您可以将数字格式化为查询的一部分,这不依赖于客户端:

SQL> select to_char(1/3, '9990D99999') from dual;

TO_CHAR(1/3
-----------
    0.33333

您需要为您正在计算的任何整数部分提供足够的数字。任何小于零的东西都很简单,但如果小数点分隔符前的数字太多,则根本不会显示:

SQL> select to_char(100000/3, '9990D99999') from dual;

TO_CHAR(100
-----------
###########

【讨论】:

  • 感谢亚历克斯的回答。我从使用 oo4o(用于 ole 的 oracle 对象)的应用程序中检查了此行为,并使用 sqlDeveloper 确认(当我使用 F5 执行 sql,而不是使用 ctrl+intro 时)。真正的问题在于 oo4o Dynaset 对象:当我尝试对两个字段的值求和时,我得到的是串联,而不是总和:,3 + ,2 = ,3,2。我想知道的是是否有一些参数或配置使oracle引擎返回没有零的数字,所以我可以打开|关闭以将零作为整数部分返回。
  • @JuanCarlosVillalobos - 数字没有格式。您似乎正在尝试添加数字的两个字符串表示形式,并且 + 运算符被视为字符串连接运算符。它是否为零似乎是一个次要问题。你肯定会得到0,30,2 吗?
  • 亚历克斯谢谢。恐怕你是 100% 正确的。 Dynaset 对象返回没有类型的数据,所以我将不得不转换数据,但它有很多代码,我想避免这种工作。感谢您的宝贵时间,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 2020-10-16
  • 2021-10-10
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多