#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. Это работает, я просто неправильно скопировал команду. Спасибо.