Разобрать столбцы в SQL по разделителю

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

COL
---------------------------------
|test|test|test11|testing|final
|test|test|test1|testing2|final3
|test|test|test17|testing|final6

Как разобрать этот столбец по | и объедините его с правой стороной существующей таблицы следующим образом:

COL1     COL2                                COL     Parse1    Parse2    Parse3   Parse4    Parse5
   1        4    |test|test|test11|testing|final       test      test    test11  testing     final
   2        6   |test|test|test1|testing2|final3       test      test    test1  testing2    final3
   5        9   |test|test|test17|testing|final6       test      test    test17  testing    final6

Есть одинаковое количество разборов для столбца COL,

Любая помощь будет большой благодарностью!

1 ответ

Решение

Не ясно, если у вас есть ведущий | в поле COL, Если это так, вы можете перейти /x[n]

Картина довольно четкая. Легко расширять или сжимать при необходимости

пример

Declare @YourTable Table ([COL] varchar(50))
Insert Into @YourTable Values 
 ('test|test|test11|testing|final')
,('test|test|test1|testing2|final3')
,('test|test|test17|testing|final6')

Select A.* 
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                      ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                      ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
                      ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
                      ,Pos8 = ltrim(rtrim(xDim.value('/x[8]','varchar(max)')))
                      ,Pos9 = ltrim(rtrim(xDim.value('/x[9]','varchar(max)')))
                From  (Select Cast('<x>' + replace((Select replace(A.Col,'|','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as B1
             ) B

Возвращает

Другие вопросы по тегам