Извлечь несколько десятичных чисел из строки в T-SQL

У меня есть таблица в SQL Server Management Studio со столбцами, содержащими диапазоны чисел в виде строк. Я пытаюсь найти способ извлечь числовые значения из строки и вставить их в новую таблицу.

Например, в таблице у меня есть значение 12.45% - 42.32% в виде строки. Я хотел бы получить 12.45 и 42.32 и вставить их в новую таблицу со столбцами min_percent и max_percent.

Я нашел несколько способов извлечь одно числовое значение из строки с помощью SQL, а также попытался изменить функцию из Извлечение чисел из текста в SQL Server (который возвращает несколько целых чисел, но не десятичных дробей), но до сих пор мне не удалось заставить его работать. Спасибо заранее за любые предложения


person Paul Woidke    schedule 24.06.2013    source источник


Ответы (3)


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

select
  cast(left(r, charindex('%', r) - 1) AS float) as minVal,
  cast(replace(right(r, charindex('-', r) - 1), '%', '') as float) AS maxVal
from ( select '22.45% - 42.32%' as r ) as tableStub
person Daniel Gimenez    schedule 24.06.2013

Функция довольно близка. Вы просто используете числовое значение и добавляете точку:

  with C as
  (
    select cast(substring(S.Value, S1.Pos, S2.L) as decimal(16,2)) as Number,
           stuff(s.Value, 1, S1.Pos + S2.L, '') as Value
    from (select @String+' ') as S(Value)
      cross apply (select patindex('%[0-9,.]%', S.Value)) as S1(Pos)
      cross apply (select patindex('%[^0-9,.]%', stuff(S.Value, 1, S1.Pos, ''))) as S2(L)
    union all
    select cast(substring(S.Value, S1.Pos, S2.L) as decimal(16,2)),
           stuff(S.Value, 1, S1.Pos + S2.L, '')
    from C as S
      cross apply (select patindex('%[0-9,.]%', S.Value)) as S1(Pos)
      cross apply (select patindex('%[^0-9,.]%', stuff(S.Value, 1, S1.Pos, ''))) as S2(L)
    where patindex('%[0-9,.]%', S.Value) > 0
  )
  select Number
  from C
person JoseTeixeira    schedule 24.06.2013

Вот подход грубой силы с использованием строковых операций, доступных в SQL Server:

with t as (
      select '12.45% - 42.32%'  as val
     )
select cast(SUBSTRING(val, 1, charindex('%', val) - 1) as float) as minval,
       cast(replace(substring(val, len(val) - charindex(' ', reverse(val))+2, 100), '%', '') as float) as maxval
from t
person Gordon Linoff    schedule 24.06.2013