Выяснить только числовую часть из строки и сохранить ее как десятичный тип данных - PullRequest
0 голосов
/ 30 сентября 2018

Я пытался использовать patindex, чтобы найти начало числового значения в строке.Моя цель - просто извлечь числовую часть из строки, исключая%.

С приведенным ниже запросом, вот мои результаты:

Выберите Column_Desc, Replace (substring ([Column_Desc], PatIndex ('% [0-9]%', [Column_Desc]),len ([Column_Desc])), '%', '') as New_Value

Column_Desc

  1. Моя налоговая ставка составляет 18,8% **.
  2. 13,8% - это моя налоговая ставка.
  3. Моя налоговая ставка 15,9% Какая у вас?

Новое_значение

  1. 18,8
  2. 13,8 - это моя налоговая ставка.
  3. 15,9 Какая у вас сумма?

Итак, результат (New_Value) должен быть 18,8, 13,8 и 15,9 с десятичным типом данных.Я не могу заставить его работать.Пожалуйста, порекомендуйте.Спасибо!

Ответы [ 4 ]

0 голосов
/ 30 сентября 2018

Ваши в ваших примерах цифры все ровно 4 символа.Если это всегда так, то самый простой метод:

select Column_Desc,
       convert(decimal(5, 1),
               left(stuff(Column_Desc, 1,
                          patindex('%[0-9]%', Column_Desc) - 1, ''), 4)
              ) as new_value

Вот это db <> fiddle .

SQL Server не имеет очень хорошей обработки строкфункции.Таким образом, возможность делать такие предположения относительно искомой строки упрощает код.

0 голосов
/ 30 сентября 2018

Если в строке может быть только одно такое число, и если оно всегда начинается с цифры (т. Е. Нет значений, опускающих 0 до десятичного числа, например '.75') и заканчивается цифрой, вы можете найти первоецифра, применяя patindex() к строке (как вы уже сделали) и последнюю цифру, применяя patindex() к reverse() строки.

SELECT convert(decimal(3, 1),
               substring(column_desc,
                         patindex('%[0-9]%',
                                  column_desc),
                         len(column_desc)
                         - patindex('%[0-9]%',
                                    column_desc)
                         - patindex('%[0-9]%',
                                    reverse(column_desc))
                         + 2)) new_value
FROM elbat;

db <> fiddle

0 голосов
/ 30 сентября 2018

Это даст вам только число перед знаком% в виде десятичной дроби.Вам нужно проверить, что% существует в предикате.

Выберите CAST (TRIM (SUBSTRING (Column_Desc, LOCATE ('%', Column_Desc)) -4, LOCATE ('%', Column_Desc) -1)) AS DECIMAL (3,1))

В своем вопросе вы показываете результат в виде: 13,8 - моя налоговая ставка.Если это одно поле, это должно быть какое-то текстовое поле.Тогда вам лучше заменить% на ''

0 голосов
/ 30 сентября 2018

Если после чисел всегда есть знак процента, вы можете попробовать выполнить следующее, а затем преобразовать или преобразовать результат в десятичное число.

Select 
    Column_Desc 
    ,Replace(
            substring([Column_Desc], 
                    PatIndex('%[0-9]%', [Column_Desc]), 
        len([Column_Desc]))
        ,'%','') as New_Value
    ,PatIndex('%[0-9]%', [Column_Desc])  as pat_Value
    ,PatIndex('%[%]%', [Column_Desc])  as pct_Value
    ,SUBSTRING(
        [Column_Desc],
        PatIndex('%[0-9]%', [Column_Desc]),
        PatIndex('%[%]%', [Column_Desc]) - PatIndex('%[0-9]%', [Column_Desc]) 
        ) as result_Value

From patindex
...