Как я могу разбить эту строку как UDF - PullRequest
0 голосов
/ 31 мая 2019

У меня есть этот столбец (из экспорта из базы данных BigCommerce), который содержит настраиваемые поля в одном столбце.Вот один пример данных:

[{"Name":"Unit Number","Value":"3698"},{"Name":"Region","Value":"Eastern Great Lakes (WNY, W PA)"}]

Мне нужен способ выяснить, как извлечь пары Field / Value из этого.В этом примере я хотел бы получить в качестве вывода:

Unit Number:3698
Region:Eastern Great Lakes (WNY, W PA)

Я надеюсь получить в результате UDF, который я могу запустить как часть запроса выбора, который дает мне толькоимя поля и значение выводятся в виде строки (как показано выше).Каждый столбец данных в исходной таблице имеет этот формат.Как правило, данные столбца имеют две пары поле / значение, но иногда их нет, иногда две, иногда три.Другими словами, в столбце содержится любое количество пар переменные поле / значение.

Есть ли у кого-нибудь предложения о том, как построить UDF, чтобы помочь вывести эти элементы данных из этой строки?

Я возился с вещами, но я застрял.Я начал с попытки удалить посторонние символы [,], которые ничего не значат, и {,}, которые очерчивают поле и значение.Я возился с функциями разделения строк, но вместо разделения на один символ я не могу понять, как разделить на основе пар открытых или закрывающих скобок {,}, чтобы сузить его.

Unit Number:3698 | Region:Eastern Great Lakes (WNY, W PA)

1 Ответ

0 голосов
/ 31 мая 2019
DECLARE @json NVARCHAR(MAX)
SET @json =  N'[{"Name":"Unit Number","Value":"3698"},{"Name":"Region","Value":"Eastern Great Lakes (WNY, W PA)"}]' 

--read from json
SELECT [Name], [Value]  
FROM OPENJSON(@json)
  WITH ([Name] NVARCHAR(100) '$.Name',  
        [Value] NVARCHAR(50) '$.Value')  

--if it has only these two fixed cols like Unit Number, Region starts here
SELECT [Region],[Unit Number] from 
             (
                SELECT [Name], [Value]  
                    FROM OPENJSON(@json)
                      WITH ([Name] NVARCHAR(100) '$.Name',  
                            [Value] NVARCHAR(50) '$.Value') 
            ) x
            pivot 
            (
                MAX([Value])
                for [Name] in ([Region],[Unit Number])
            ) p 
--if it has only these two fixed cols like Unit Number, Region ends here

--********if it has dynamic columns starts here********
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME([Name])  
            FROM OPENJSON(@json)
              WITH ([Name] NVARCHAR(100) '$.Name',  
                    [Value] NVARCHAR(50) '$.Value') 

            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @query = 'SELECT ' + @cols + ' from 
             (
                SELECT [Name], [Value]  
                    FROM OPENJSON(@json)
                      WITH ([Name] NVARCHAR(100) ''$.Name'',  
                            [Value] NVARCHAR(50) ''$.Value'') 
            ) x
            pivot 
            (
                MAX([Value])
                for [Name] in (' + @cols + ')
            ) p ' 

print @query
EXEC sp_executesql @query, N'@json NVARCHAR(MAX)', @json
--********if it has dynamic columns ends here********

Примечание: это будет работать только с MSSQL 2016/17 или выше, используется v17.1

...