SQL - разбить строку на столбцы по нескольким разделителям - PullRequest
0 голосов
/ 03 сентября 2018

Похоже, что существует множество решений этой проблемы, однако мои решения должны быть динамическими, поскольку количество разделителей изменяется от 0 до 3, и должно быть относительно эффективным, так как оно будет проходить через> 10 м рядов в 5 циклах.

Как пример:

  US

  US-AL

  US-AL-Talladega

  US-AL-Talladega-35160

Решение должно иметь возможность вносить каждый элемент в поле Country, State, County, ZIP с полем NULL, если информация не находится в строке.

Любые комментарии о наилучшем подходе будут оценены или даже укажут мне направление, где я, возможно, пропустил решение, будет очень признателен

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Другой вариант с небольшим XML в сочетании с CROSS или OUTER APPLY

* ** 1003 тысяча два * Пример
Declare @YourTable table (YourCol varchar(100))
Insert Into @YourTable values
 ('US')
,('US-AL')
,('US-AL-Talladega')
,('US-AL-Talladega-35160')

Select A.* 
      ,B.*
 From @YourTable A
 Outer Apply (
                Select Country = xDim.value('/x[1]','varchar(max)')
                      ,State   = xDim.value('/x[2]','varchar(max)')
                      ,County  = xDim.value('/x[3]','varchar(max)')
                      ,ZIP     = xDim.value('/x[4]','varchar(max)')
                From  (Select Cast('<x>' + replace(YourCol,'-','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

Возвращает

YourCol                 Country State   County      ZIP
US                      US      NULL    NULL        NULL
US-AL                   US      AL      NULL        NULL
US-AL-Talladega         US      AL      Talladega   NULL
US-AL-Talladega-35160   US      AL      Talladega   35160
0 голосов
/ 03 сентября 2018

вам понадобится разделитель с разделителями. Как DelimitedSplit8K из http://www.sqlservercentral.com/articles/Tally+Table/72993/

; with tbl as
(
    select  col = 'US'          union all
    select  col = 'US-AL'           union all
    select  col = 'US-AL-Talladega'     union all
    select  col = 'US-AL-Talladega-35160'
)
select  t.col,
        max(case when ItemNumber = 1 then Item end) as Country,
        max(case when ItemNumber = 2 then Item end) as State,
        max(case when ItemNumber = 3 then Item end) as County,
        max(case when ItemNumber = 4 then Item end) as Zip
from    tbl t
        cross apply dbo.[DelimitedSplit8K](t.col, '-')
group by t.col
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...