Laz*_*zer 6 oracle oracle-11g-r2
SQL> select TO_NUMBER(123.56,'999.9') from dual;
select TO_NUMBER(123.56,'999.9') from dual
*
ERROR at line 1:
ORA-01722: invalid number
SQL> select TO_CHAR(123.56,'999.9') from dual;
TO_CHA
------
123.6
SQL>
Run Code Online (Sandbox Code Playgroud)
我很难理解 Oracle SQL 的细微差别。例如,看看上面的两个查询。
为什么第一个查询失败而第二个查询成功?
根据文档, to_number 的第一个值需要是
BINARY_DOUBLE 值或 CHAR、VARCHAR2、NCHAR 或 NVARCHAR2 数据类型的值,其中包含可选格式模型指定格式的数字
因此 Oracle 将 123.56 隐式转换为字符值。然后问题来了 to_number 的格式与给定的值不匹配。可以看出这是因为以下两种变体会出现相同的错误:
select to_number(to_char(123.56),'999.9') from dual;
select to_number('123.56','999.9') from dual;
Run Code Online (Sandbox Code Playgroud)
但你不这样做:
select to_number(123.56,'999.99') from dual;
Run Code Online (Sandbox Code Playgroud)
将字符转换为数字时,格式说明必须完全匹配,但在将数字转换为字符时,可以使用格式说明符有选择地提取数字。