Я очень новичок в sql. Может ли кто-нибудь помочь мне превратить данные 4229,4 в 4229,4000000?

Текущие данные: 4229,4
ожидаемый результат: 4229.4000000

-2
Pratik 29 Окт 2019 в 08:42
Расскажите, пожалуйста, о вашем сценарии. Как получить эти данные? Со стола? Преобразовывают ли строку в число или число в строку?
 – 
APC
29 Окт 2019 в 09:24
Я получаю это из таблицы
 – 
Pratik
29 Окт 2019 в 09:32
Вы ответили на один из моих вопросов.
 – 
APC
29 Окт 2019 в 09:37
Является ли 4229,4 хранилища в таблице числовым типом или типом varchar?
 – 
Caius Jard
29 Окт 2019 в 10:29
Какая у вас локаль?
 – 
Rick James
25 Ноя 2019 в 22:02

3 ответа

Предположим, у вас есть таблица с именем T42 со столбцом с именем NUMBER_STR, в котором есть строки чисел в формате nnnn,nnn. Этот вызов функции заменяет запятую десятичной точкой и преобразует строку в число до семи разрядов:

select number_str
       ,cast(replace(number_str, ',', '.') as number(38,7)) as number_nbr
from t42
/

Вот демонстрация db <> fiddle. Имейте в виду, что за отображение чисел отвечает заказчик. Большинство пользовательских интерфейсов по умолчанию скрывают конечные нули.

Обратите внимание, что в приведенном выше решении предполагается, что строковый столбец содержит только допустимые числа. Уроки истории заключаются в том, что это опасное предположение: в конечном итоге любой столбец со слабой типизацией будет содержать строки, которые отклоняются от ожидаемого формата. В Oracle 12c R2 появилась полезная функция validate_conversion(), которая позволяет нам проверять, можно ли преобразовать значение в другой тип данных. Узнать больше.

1
APC 29 Окт 2019 в 14:24

Вы можете использовать REGEXP_REPLACE для форматирования вашего number_str:

SELECT REGEXP_REPLACE(<NUMBER_STR>||'0000000', '(\d+),(\d{7})\d*','\1.\2') FROM <TABLE>
0
Radagast81 29 Окт 2019 в 12:27
select
     rpad(replace(substr('4229,4',1,instr('4229,4',',',1) ),',','.')
          || substr('4229,4',instr('4229,4',',',1) + 1,length('4229,4') ),12,0)
 from
     dual

Это будет работать для всех, независимо от того, где находится запятая и длина текста, который вы передадите. Он всегда будет выводить строку фиксированной длины (12).

Хотя rpad возвращает строковое значение. Поэтому вам, возможно, придется принять это во внимание при повторном использовании значения.

Надеюсь, что это поможет вам.

0
Arif Sher Khan 29 Окт 2019 в 14:27
Я действительно ищу что-то динамичное. данные на самом деле выглядят как 3234,3 или 125,5 (запятая ',' а не десятичный '.'), и мне нужно каждый раз преобразовывать его в 4229.4000000 в этом формате. Благодарю за ваш ответ
 – 
Pratik
29 Окт 2019 в 09:11
Я отредактировал ответ. Пожалуйста, вернитесь, если возникнут проблемы. Для динамической части вместо «4229,4» (без одинарных кавычек) поместите имя столбца, из которого вы получаете данные.
 – 
Arif Sher Khan
29 Окт 2019 в 14:35