Как преобразовать число с десятичными значениями в число с плавающей точкой в ​​PL / SQL? - PullRequest
0 голосов
/ 02 апреля 2020

Проблема в том, что мне нужно вставить этот номер в json, и, поскольку номер содержит запятую, json становится недействительным. Флоат будет работать, потому что он содержит точку, а не запятую.

Я пытался использовать replace(v_decimalNumber,',','.'), и это работает, за исключением того, что свойство json преобразуется в строку. Мне нужно, чтобы это оставалось каким-то типом числового значения.

Как этого можно достичь?

Я использую Oracle 11g.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Тип данных v_decimalNumber - это некоторый тип символьного формата, поскольку он может содержать запятые (,). Вы утверждаете, что он содержит число после удаления запятых. Тем не менее, НЕТ ТАКОГО, пока это утверждение не будет подтверждено, поскольку, будучи символом, я могу поместить в него любые символы, которые я хочу, с учетом любого ограничения длины. Например, столбец электронной таблицы, который должен содержать цифры c. Однако пользователи, которые не применяются, часто заставляют N / A говорить, что это не применимо. Oracle с радостью загрузит это в ваш v_decimalNumber. (И это один из многих способов, которыми нечисловые c данные могут попасть в ваш столбец.) Поэтому, прежде чем пытаться обработать как числовое c значение, вы должны проверить, действительно ли это действительные числовые c данные. Следующий пример демонстрирует один такой способ.

with some_numbers (n) as
     ( select '123,4456,789.00' from dual union all 
       select '987654321.00'    from dual union all 
       select '1928374655'      from dual union all
       select '1.2'             from dual union all
       select '.1'              from dual union all  
       select '1..1'            from dual union all 
       select 'N/A'             from dual
     )
   , rx as (select '^[0-9]*\.?[0-9]*$' regexp from dual) 
select n
     , case when regexp_like(replace(n,',',null), regexp)
            then to_number(replace(n,',',null))
            else null
       end Num_value
    , case when regexp_like(replace(n,',',null), regexp)
            then null
            else 'Not valid number'
      end msg
 from some_numbers,rx ;

Убрать: Никогда не доверяйте столбцу типа символов, чтобы он содержал определенные c требования к данным, кроме случайных символов. Всегда проверяйте, а затем помещайте данные в соответствующие столбцы.

0 голосов
/ 02 апреля 2020

Вам просто нужна функция to_number().

select to_number(replace('1,2', ',', '.')) float_nr from dual;

Результат:

FLOAT_NR
1.2

Обратите внимание, что если ваш номер имеет .0 как 1.0, функция удалит его и оставь только 1

...