Разделение строки с разделителями переменной длины на несколько строк (SQL) - PullRequest
1 голос
/ 11 августа 2010

У меня есть таблица, которая содержит в одном столбце строку переменной длины, например:

20,0, 5 ,, ^ 24,0, 0 ,, ^ 26,0, 0,, ^
281,0, 0 ,, ^ 34,0, 2 ,, ^ 48,0, 2 ,, ^ 44,0, 2 ,, ^ 20,0, 10 ,, ^
20, 5, 5 ,, ^ 379,1, 1 ,, ^ 26,1, 2 ,, ^ 32,0, 1 ,, ^ 71,0, 2 ,, ^

Что янужно разделить эту строку так, чтобы каждое число после символа ^ возвращалось в новую строку.как:

Номер товара Код товара
Item1 20
Item2 ^ 24
Item3 ^ 24
Item4 ^ 27
Item5 ^ 28
Item6 ^ 65
Item7 ^ 66
Item8 ^ 39
Item9 ^ 379
Item10 ^ 448
Item11 ^ 427

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

Есть идеи лучшего подхода?

1 Ответ

0 голосов
/ 11 августа 2010

Во-первых, позвольте мне просто сказать, что это причина того, что вы не должны сначала разделять запятыми данные в поле.Нет простого или эффективного способа работы с ним.

Тем не менее, вы можете использовать рекурсивный запрос, чтобы разбить строку и получить из нее числа:

with split as
(
  select
    item = cast('' as varchar(max)),
    source = cast('20,0, 5,,^24,0, 0,,^26,0, 0,,^281,0, 0,,^34,0, 2,,^48,0, 2,,^44,0, 2,,^20,0, 10,,^20,5, 5,,^379,1, 1,,^26,1, 2,,^32,0, 1,,^71,0, 2,,^' as varchar(max))
  union all
  select
    item = substring(source, 1, charindex(',,', source)),
    source = substring(source, charindex(',,', source) + 2, 10000)
  from split
  where source > ''
)
select substring(item, 1, charindex(',', item) -1)
from split
where item > ''

Результат:

20
^24
^26
^281
^34
^48
^44
^20
^20
^379
^26
^32
^71
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...