Использование TO_NUMBER для разбора чисел как в фиксированной записи, так и в научной нотации c - PullRequest
4 голосов
/ 29 апреля 2020

Используя Oracle SQL, как я могу преобразовать строку в число, если строка (столбец VARCHAR2) может содержать:

  • число в фиксированной записи, например как -11.496606820938826

    SELECT TO_NUMBER('-11.496606820938826', '999.999999999999999999', 'NLS_NUMERIC_CHARACTERS=''. ''') FROM DUAL;
    
  • число в научной нотации c, такое как -4.0504035245989348E-3

    SELECT TO_NUMBER('-4.0504035245989348E-3', '999.999999999999999999EEEE', 'NLS_NUMERIC_CHARACTERS=''. ''') FROM DUAL;
    

Пока Я использовал следующие модели формата :

  • Фиксированная запись: 999.999999999999999999
  • Scientifi c запись: 999.999999999999999999EEEE

но я не могу найти модель единого формата, которая работает в обоих случаях.

Пример данных:

 STRING_VALUE
------------------------
 -4.0504035245989348E-3 
 -11.496606820938826    
------------------------

Я использую Oracle 12.1, поэтому я могу ' t * либо VALIDATE_CONVERSION , ни ON ОШИБКА КОНВЕРСИИ .

Редактировать

Кроме того, этот код будет работать на разных окружающая среда с различными настройками NLS; Я не могу предположить, что использование TO_NUMBER без модели формата будет просто работать.

1 Ответ

2 голосов
/ 30 апреля 2020

Как насчет использования оператора CASE?

CREATE TABLE t (v VARCHAR2(30));
INSERT INTO t VALUES ('-11.49660682093882');
INSERT INTO t VALUES ('-4.0504035245989348E-3');

SELECT v, CASE WHEN v LIKE '%E%' 
           THEN TO_NUMBER(v, '999.999999999999999999EEEE', 'NLS_NUMERIC_CHARACTERS=''. ''')
           ELSE TO_NUMBER(v, '999.999999999999999999',     'NLS_NUMERIC_CHARACTERS=''. ''') 
          END AS x
  FROM t;

V                        X
-11.49660682093882       -11,49660682093882
-4.0504035245989348E-3   -0,0040504035245989348
...