Как я могу преобразовать эти входные данные в число с помощью Oracle

#sql #oracle #oracle12c

Вопрос:

Я не смог найти правильное преобразование в десятичное число из поля, объявленного как varchar.

Оракул 12с

В источнике информации говорится,что они установили этот формат: ‘S9999999999999V, 99’

Я использовал функцию TO_NUMBER (), но не могу найти правильное приведение и аргументы для правильного чтения и преобразования источника.

С отправкой только TO_NUMBER(поле) и ошибкой недопустимого номера.

Примеры полученных данных

  1. 0000000000160,00
  2. -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<> показывает выходные данные сеанса по умолчанию и измененные.