oracle 格式说明符:to_number vs to_char

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 的细微差别。例如,看看上面的两个查询。

为什么第一个查询失败而第二个查询成功?

Lei*_*fel 7

根据文档, 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)

将字符转换为数字时,格式说明必须完全匹配,但在将数字转换为字符时,可以使用格式说明符有选择地提取数字。