ORA-01722: недопустимые числовые строки начинаются с запятой передача VARCHAR2 TO_NUMBER

#sql #oracle #type-conversion #oracle12c #varchar2

#sql #Oracle #преобразование типа #oracle12c #varchar2

Вопрос:

У меня есть следующие исходные данные в формате VARCHAR2

 ,00100000004749745   
,100000001490116  
,125  
,200000002980232  
,25  
,439999997615814  
,5  
0  
1  
1,10000002384186  
1,5  
100  
2,1800000667572  
3   
3,29999995231628  
96  
999
  

Какова формула для переноса его в NUMBER?

Со следующим

 INSERT INTO table_b.column_b
    SELECT 
        TO_NUMBER (column_a,'9999999999D9999999999999999999999',
        'nls_numeric_characters= ''.,''') as my_numbers
    FROM table_a.column_a;
  

Я получаю сообщение об ошибке

ORA-01722: сообщение об ошибке недопустимого номера.

Я предполагаю, что это связано с тем, что строки начинаются с запятой, например (,125).

В целевой таблице мне нужны данные в числовом формате, подобные этому

 0,00100000004749745   
0,100000001490116  
0,125  
0,200000002980232  
0,25 
0,439999997615814  
0,5 
0
1
...
  

Также пытался поставить ноль ‘0’ перед запятой, и они меняют его на число с

 Select 
    column_a,
    TO_NUMBER (column_a,'9999D9999999999999999999999',
   'nls_numeric_characters= ''.,''')  as my_number 
from 
    (SELECT DISTINCT 
         '0'|| column_a
     FROM table_a.column_a
     WHERE column_a LIKE (',125')
    );
  

но результат был

 0,125   125
  

Комментарии:

1. Как вы преобразуете это: ,5 0 1 1,10000002384186 в допустимое число?

2. Это мой вопрос. На выходе мне нужно 0,5 0 1 1.1000000002384186 и т.д. Возможно ли это как-то? Возможно, необходимо использовать дополнительное форматирование, помимо ПРИВЕДЕНИЯ или TO_NUMBER .

3. Вы пытаетесь преобразовать ,5 0 1 1,10000002384186 в четыре отдельных числа?

4. Возможно, вам, Дэниел, следует переформатировать вопрос и — для каждого из входных значений — показать желаемое выходное значение. Обратите внимание на форматирование ; текст — как есть — трудно читать. Опубликовать его в качестве комментария еще сложнее.

5. О да, это ошибка при вводе. Я исправлю это.

Ответ №1:

Как сказал Василий, ваши nls_numeric_characters потребности должны быть скорректированы. Приведенный ниже запрос демонстрирует, как преобразовать строку в число.

 WITH
    my_numbers (column_a)
    AS
        (SELECT ',00100000004749745' FROM DUAL
         UNION ALL
         SELECT ',100000001490116' FROM DUAL
         UNION ALL
         SELECT ',125' FROM DUAL
         UNION ALL
         SELECT ',200000002980232' FROM DUAL
         UNION ALL
         SELECT ',25' FROM DUAL
         UNION ALL
         SELECT ',439999997615814' FROM DUAL
         UNION ALL
         SELECT ',5' FROM DUAL
         UNION ALL
         SELECT '0' FROM DUAL
         UNION ALL
         SELECT '1' FROM DUAL
         UNION ALL
         SELECT '1,10000002384186' FROM DUAL
         UNION ALL
         SELECT '1,5' FROM DUAL
         UNION ALL
         SELECT '100' FROM DUAL
         UNION ALL
         SELECT '2,1800000667572' FROM DUAL
         UNION ALL
         SELECT '3' FROM DUAL
         UNION ALL
         SELECT '3,29999995231628' FROM DUAL
         UNION ALL
         SELECT '96' FROM DUAL
         UNION ALL
         SELECT '999' FROM DUAL)
SELECT n.column_a,
       TO_NUMBER (n.column_a,
                  '9999999999D9999999999999999999999999999',
                  'nls_numeric_characters= '', ''')    AS column_a_as_number
  FROM my_numbers n;
  

Ответ №2:

Похоже, вы используете неправильные nls_numeric_characters значения. Попробуйте заменить 'nls_numeric_characters=''.,''' на 'nls_numeric_characters='', '''

Объяснение: ваши nls_numeric_characters определены . как десятичный разделитель и , как разделитель группы, но, согласно вашему примеру, вы предполагаете, что десятичный разделитель равен ,

Комментарии:

1. Нет, я тоже пробую это, но возникает ошибка ‘ORA-12702: недопустимая строка параметра NLS, используемая в функции SQL’

2. Это работает, я просто неправильно скопировал команду. Спасибо.