2015-02-15 5 views
0

Вот пример:SQL - Извлечение числовой части переменной длины строки

[U_TipTon] = 118.7-> 59,35; [U_Haulge] = 428.28-> 214,14

Мне нужно извлечь только 118,7 -> 59.35 как Типтон и 428.28-> 214.14 в другой колонке как U_Haulage.

Длина строки является переменной, а также позицией os my pattern word.

Я пытаюсь с Patindex, но я не могу найти способ.

+0

Вы используете mysql или другое? – Mihai

ответ

1

В MySQL есть SUBSTRING_INDEX, которая извлекает подстроку, основанный на разделителем:

select 
    substring_index(substring_index(x, '[U_TipTon]=', -1), ';', 1) as TipTon 
    ,substring_index(substring_index(x, '[U_Haulge]=', -1), ';', 1) as Haulge 
from 
(
    select '[U_TipTon]=118.7->59.35;[U_Haulge]=428.28->214.14' as x 
) as dt 

Edit: В MS SQL Server это сложнее:

select 
    substring(xHaulge, 1, charindex(';', xHaulge + ';')-1) as Haulge, 
    substring(xTipTon, 1, charindex(';', xTipTon + ';')-1) as TipTon 
from 
(
    select 
     case when charindex('[U_Haulge]=', x) > 0 
      then substring(x, charindex('[U_Haulge]=', x) + len('[U_Haulge]='), 8000) 
      else '' 
     end as xHaulge, 
     case when charindex('[U_TipTon]=', x) > 0 
      then substring(x, charindex('[U_TipTon]=', x) + len('[U_TipTon]='), 8000) 
      else '' 
     end as xTipTon 
    from 
    (
     select '[U_TipTon]=118.7->59.35;[U_Haulge]=428.28->214.14' as x 
    ) as dt 
) as dt 
+0

Спасибо за ваш ответ. Я использую SQL .. –

+0

Идея будет работать для 1 определенной строки, но у меня есть 4000 строк, в которых положение этих слов, чисел и длины различаются в каждой строке. –

+0

Вы действительно попробовали мой запрос по вашим данным? Он работает точно так же, как и запрос, если пары имя/значение разделены точками с запятой. – dnoeth

0

Решение было:

кейс когда charindex ('Haulge', t.xField)> 0, то

подстрока (t.xField, charindex ('Haulge', t.xField) + 8, случай, когда charindex (';', подстрока (t.xField, charindex ('Haulge', t.xField) + 8, LEN (t.xField)) = 0 затем LEN (t.xField) else charindex (';', substring (t.xField, charindex ('Haulge', t.xField) + 8, LEN (t.xField))) -1 конец) еще '-' конец [Хол цены] , случай, когда CHARINDEX ('Типтон', t.xField)> 0, то

подстроку (t.xField, CHARINDEX ('TIPTON', т .xField) + 8, случай, когда charindex (';', substring (t.xField, charindex ('Tipton', t.xField) + 8, LEN (t.xField))) = 0 , затем LEN (t.xField) еще charindex (';', подстрока (t.xField, charindex ('Tipton', t.xField) + 8, LEN (t.xField))) - 1 конец) else '-' end [Цена совета] , case когда charindex ('AItmPr', t.xField)> 0, то

подстрока (t.xField, charindex ('AItmPr', t.xField) + 8, случай, когда charindex (';', substring (t.xField , charindex ('AItmPr', t.xField) + 8, LEN (t.xField))) = 0 затем LEN (t.xField) else charindex (';', substring (t.xField, charindex ('AItmPr ', t.xField) + 8, LEN (t.xField))) - 1 end) else' - 'end [Дополнительная цена]

Смежные вопросы