TO_NUMBER игнорирует запятую, даже если она не в формате модели - PullRequest
0 голосов
/ 24 мая 2018

Я только что заметил это, и для меня это не имеет смысла:

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 пример.

1 Ответ

0 голосов
/ 24 мая 2018

Это одна из тех «особенностей» в 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

Таким образом, даже если строка не соответствует маске формата, база данных все равно выполнила преобразование из-за уверенности во входном формате.

...