【问题标题】:TO_NUMBER ignores comma even when it's not in format modelTO_NUMBER 忽略逗号,即使它不在格式模型中
【发布时间】:2018-11-03 01:48:31
【问题描述】:

我刚刚注意到这一点,这对我来说毫无意义:

select to_number( '10000', '999G990' ) from dual;

ORA-01722: invalid number

好的,这是有道理的,格式模型包含G,组分隔符,它与我的字符串不匹配,因此引发了 ORA-01722。

select to_number( '10,000', '999990' ) as x from dual;

         X
----------
     10000

但在这种情况下,我的格式模型包含组分隔符,而我的字符串包含。那么 ORA-01722 不应该再次提出来吗?

而且绝对没有意义,

select to_number( '10,0000', '999990' ) as x from dual;

         X
----------
    100000

等等,什么? 10,0000 甚至不是一个有效的数字。当它们不在格式模型中时,TO_NUMBER 是否只是忽略组分隔符?我在文档中的任何地方都找不到关于此的任何信息。

编辑:

我在 Oracle XE (11gR2) 和 12cR2 上注意到了这一点。 SQLFiddle 例子。

【问题讨论】:

  • 你的最后一个例子是failing for me。或许可以告诉我们您使用的是哪个版本的 Oracle。

标签: sql oracle oracle11g oracle12c string-conversion


【解决方案1】:

这是 Oracle 中我不一定非常喜欢的“功能”之一。在尝试转换时,如果我们确信转换中没有歧义,我们将尝试通过查看转换是否可能来“帮助”,例如

SQL> select to_number( '10,000', '999990' ) as x from dual;

         X
----------
     10000

SQL> select to_number( '10,00000,0', '9999999990' ) as x from dual;

         X
----------
  10000000

日期也有类似的行为,例如

SQL> select to_date('01-MAR-2000','dd/mm/yyyy') from dual;

TO_DATE('01
-----------
01-MAR-2000

因此,即使字符串与格式掩码不匹配,由于对输入格式的信任,数据库还是会执行转换。

【讨论】:

  • 我应该指出 Application Express 中的数字字段不遵循此约定。如果您在此类字段中输入“10,000”,则会收到“项目必须为数字”错误。 apex.oracle.com/pls/apex/f?p=62159:8
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 2012-11-30
相关资源
最近更新 更多