TO_NUMBER 忽略逗号,即使它不在格式模型中
TO_NUMBER ignores comma even when it's not in format model
我刚刚注意到这一点,但对我来说没有任何意义:
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 示例。
它是 Oracle 中的那些 "features" 之一,我不一定是它的超级粉丝。尝试转换时,如果我们确信转换中没有歧义,我们将尝试 "help" 查看是否可以转换,例如
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
因此,即使字符串与格式掩码不匹配,由于对输入格式的信任,数据库仍然执行了转换。
我刚刚注意到这一点,但对我来说没有任何意义:
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 示例。
它是 Oracle 中的那些 "features" 之一,我不一定是它的超级粉丝。尝试转换时,如果我们确信转换中没有歧义,我们将尝试 "help" 查看是否可以转换,例如
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
因此,即使字符串与格式掩码不匹配,由于对输入格式的信任,数据库仍然执行了转换。