#sql #oracle #oracle12c
Вопрос:
Я не смог найти правильное преобразование в десятичное число из поля, объявленного как varchar.
Оракул 12с
В источнике информации говорится,что они установили этот формат: ‘S9999999999999V, 99’
Я использовал функцию TO_NUMBER (), но не могу найти правильное приведение и аргументы для правильного чтения и преобразования источника.
С отправкой только TO_NUMBER(поле) и ошибкой недопустимого номера.
Примеры полученных данных
- 0000000000160,00
- -9999999999999,99
Я продолжаю получать сообщение об ошибке недопустимого номера.
Комментарии:
1. Вы уверены насчет буквы V в формате? И какие значения вы ожидаете преобразовать в эти два примера: 160 и -9999999999999,99?
2. что касается формата, да, это то, что я получил в документации от исходной команды, 99999-это отправленные ими тестовые данные, не столь релевантные, но я думаю, что номер to_number также должен быть в состоянии преобразовать его. 160,00 — это то, чего я ожидал.
3. Хмм. Они сказали, что для них значит буква «В»? Не уверен, что это имеет смысл или законно, с
V,99
4. Когда вы получите сообщение об ошибке, пожалуйста, вырежьте и вставьте все сообщение целиком, а не перефразируйте его.
Ответ №1:
Буква V в формате исходной информации выглядит неправильно; из документации:
Элемент Пример Описание V 999В99 Возвращает значение, умноженное на 10n (и при необходимости округлите его), где n-число 9 после V.
Если остальная часть модели верна, и кажется, что она соответствует двум примерам, то вы, вероятно, хотите:
to_number(source, 'S9999999999999D99', 'NLS_NUMERIC_CHARACTERS=,.')
fmt
Часть такая же, как вам было сказано, только с удаленным V и с D, чтобы отметить десятичный разделитель; и nls
часть говорит, что десятичный разделитель-это запятая.
-- CTE for sample data
with your_table (source) as (
select ' 0000000000160,00' from dual
union all
select '-9999999999999,99' from dual
)
-- query against sample data
select source,
to_number(source, 'S9999999999999D99', 'NLS_NUMERIC_CHARACTERS=,.') as result
from your_table
дает
SOURCE RESULT
----------------- -----------------
0000000000160,00 160
-9999999999999,99 -9999999999999.99
Клиент выберет, отображать ли преобразованное значение с десятичным разделителем через запятую или точку, обычно с помощью настроек NLS. Вы можете изменить этот параметр сеанса или явно преобразовать число обратно в строку в определенном формате.
db<>fiddle<> показывает выходные данные сеанса по умолчанию и измененные.