Поверните результат SPLIT_STRING? - PullRequest
2 голосов
/ 18 октября 2019

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

/TYPE/BOOKING/IBAN/NL12BANK0003456789/BIC/BANKNL2A/NAME/Mr. A. Someguy/CODE/Codenumber 12345678/REF/NOTPROVIDED/LINE/ABCD EFG 234567890 1234 ETC
/TYPE/BOOKING/IBAN/NL34BANK000123456/BIC/BANKNL2U/NAME/Mr. A. Dinges/CODE/98765432/REF/NOTPROVIDED

И я хочу посмотреть отдельные элементы в этих строках без необходимости писать нечитаемый код со многими CHARINDEX-es и SUBSTRINGS. Итак, я нашел функцию SPLIT_STRING.

select contract, [value]
from SCHEMA.PAYMENTS
    CROSS APPLY STRING_SPLIT(paymentrow, '/')

Это здорово, но теперь я получаю эти значения в строках:

bookingnumber   value
12-3-56789012-3 
12-3-56789012-3 TYPE
12-3-56789012-3 BOOKING
12-3-56789012-3 IBAN
12-3-56789012-3 NL12BANK0003456789
12-3-56789012-3 BIC
12-3-56789012-3 BANKNL2A
12-3-56789012-3 NAME
12-3-56789012-3 Mr. A. Someguy
12-3-56789012-3 CODE
12-3-56789012-3 Codenumber 12345678
12-3-56789012-3 REF
12-3-56789012-3 NOTPROVIDED
12-3-56789012-3 LINE
12-3-56789012-3 ABCD EFG 234567890 1234 ETC
98-7-65431234-0 
98-7-65431234-0 TYPE
98-7-65431234-0 BOOKING
98-7-65431234-0 IBAN
98-7-65431234-0 NL34BANK000123456
98-7-65431234-0 BIC
98-7-65431234-0 BANKNL2U
98-7-65431234-0 NAME
98-7-65431234-0 Mr. A. Dinges
98-7-65431234-0 CODE
98-7-65431234-0 98765432
98-7-65431234-0 REF
98-7-65431234-0 NOTPROVIDED

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

bookingnumber    type     IBAN                BIC       name            code                 ref
12-3-56789012-3  BOOKING  NL12BANK0003456789  BANKNL2A  Mr. A. Someguy  Codenumber 12345678  NOTPROVIDED
98-7-65431234-0  BOOKING  NL34BANK0001234567  BANKNL2U  Mr. A. Dinges   98765432             NOTPROVIDED

Я возился с PIVOT, но либо он не работает, либо не дает правильных результатов.

Помощь будет принята с благодарностью.

Ответы [ 3 ]

3 голосов
/ 18 октября 2019

Ваша собственная попытка вызова STRING_SPLIT() доказательств того, что вы используете v2016 +. Таким образом, вы можете вызвать JSON для вашего спасения:

(Кредит Джону Каппеллетти для макета )

Declare @YourTable table (Bookingnumber varchar(50),paymentrow varchar(max) )
Insert Into @YourTable values
 ('12-3-56789012-3','/TYPE/BOOKING/IBAN/NL12BANK0003456789/BIC/BANKNL2A/NAME/Mr. A. Someguy/CODE/Codenumber 12345678/REF/NOTPROVIDED/LINE/ABCD EFG 234567890 1234 ETC')
,('98-7-65431234-0','/TYPE/BOOKING/IBAN/NL34BANK000123456/BIC/BANKNL2U/NAME/Mr. A. Dinges/CODE/98765432/REF/NOTPROVIDED');

SELECT *
FROM @YourTable t
CROSS APPLY OPENJSON(CONCAT('[{',REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
                                        t.paymentrow,'/TYPE/','"Type":"')
                                                     ,'/IBAN/','","IBAN":"')
                                                     ,'/BIC/','","BIC":"')
                                                     ,'/NAME/','","Name":"')
                                                     ,'/CODE/','","Code":"')
                                                     ,'/REF/','","Ref":"')
                                                     ,'/LINE/','","Line":"'),'"}]'))
            WITH([Type] NVARCHAR(100)
                ,[IBAN] NVARCHAR(100)
                ,[BIC] NVARCHAR(100)
                ,[Name] NVARCHAR(250)
                ,[Code] NVARCHAR(100)
                ,[Ref] NVARCHAR(100)
                ,[Line] NVARCHAR(500)) A;

Мы используем некоторые замены, чтобы преобразовать вашу строку в такойJSON

[{"Type":"BOOKING",
  "IBAN":"NL12BANK0003456789",
  "BIC":"BANKNL2A",
  "Name":"Mr. A. Someguy",
  "Code":"Codenumber 12345678",
  "Ref":"NOTPROVIDED",
  "Line":"ABCD EFG 234567890 1234 ETC"}]

Предложение WITH сделает поворот неявно.

ОБНОВЛЕНИЕ Если это безопасно с позиции

При фиксированном шаблоне ввода это легче

SELECT *
FROM @YourTable t
CROSS APPLY OPENJSON(CONCAT('[["',REPLACE(STUFF(t.paymentrow,1,1,''),'/','","'),'"]]'))
            WITH([Type] NVARCHAR(100) '$[1]'
                ,[IBAN] NVARCHAR(100) '$[3]'
                ,[BIC] NVARCHAR(100) '$[5]'
                ,[Name] NVARCHAR(250) '$[7]'
                ,[Code] NVARCHAR(100) '$[9]'
                ,[Ref] NVARCHAR(100) '$[11]'
                ,[Line] NVARCHAR(500) '$[13]') A;

Промежуточный JSON-массив выглядит так:

["TYPE","BOOKING","IBAN","NL12BANK0003456789","BIC","BANKNL2A","NAME","Mr. A. Someguy","CODE","Codenumber 12345678","REF","NOTPROVIDED","LINE","ABCD EFG 234567890 1234 ETC"]
3 голосов
/ 18 октября 2019

ЕСЛИ столбцы не являются динамическими, возможно, немного XML

Пример

Declare @YourTable table (Bookingnumber varchar(50),paymentrow varchar(max) )
Insert Into @YourTable values
 ('12-3-56789012-3','/TYPE/BOOKING/IBAN/NL12BANK0003456789/BIC/BANKNL2A/NAME/Mr. A. Someguy/CODE/Codenumber 12345678/REF/NOTPROVIDED/LINE/ABCD EFG 234567890 1234 ETC')
,('98-7-65431234-0','/TYPE/BOOKING/IBAN/NL34BANK000123456/BIC/BANKNL2U/NAME/Mr. A. Dinges/CODE/98765432/REF/NOTPROVIDED')

Select A.Bookingnumber
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select Type = xDim.value('/x[3]','varchar(max)')
                      ,IBan = xDim.value('/x[5]','varchar(max)')
                      ,BIC  = xDim.value('/x[7]','varchar(max)')
                      ,Name = xDim.value('/x[9]','varchar(max)')
                      ,Code = xDim.value('/x[11]','varchar(max)')
                      ,Ref  = xDim.value('/x[13]','varchar(max)')
                From  ( values (cast('<x>' + replace(paymentrow,'/','</x><x>')+'</x>' as xml))) as A(xDim)
             ) B

Возвращает

enter image description here

1 голос
/ 18 октября 2019
SELECT  contract
,       x.value('/M[3]', 'nvarchar(max)') as IBAN
,       x.value('/M[5]', 'nvarchar(max)') as BIC
,       x.value('/M[7]', 'nvarchar(max)') as NAME
FROM    (
        SELECT  contract
        ,       CAST('<M>' + REPLACE(paymentrow, '/', '</M><M>') + '</M>' AS xml) AS x
        FROM    payments
        ) sub

Пример на dbfiddle.co.uk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...