Извличане на множество десетични числа от низ в 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