Как разобрать столбец JSON в таблице с помощью TSQL - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь открыть строку JSON и каждый ключ должен иметь свой собственный столбец.Столбец JSON находится в таблице метаданных с ключом и полиморфным идентификатором.

enter image description here

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

enter image description here

Я могу проанализировать каждый ключ один за другим с помощью json_query, но я вижу, что есть вызов функции openjson, которыйМожно проанализировать всю строку, но я не знаю, как ее использовать, поскольку в примере из документации применяется функция для заданного значения вместо столбца таблицы.Если есть более простой способ анализа строки JSON, чем использование json_query?

Ответы [ 4 ]

1 голос
/ 28 марта 2019

Вы можете попробовать следующий подход, используя предложения OPENJSON() и WITH (чтобы указать столбцы и их типы).Без WITH предложение OPENJSON возвращает три столбца - key, value и type каждой пары {key: value}.

Ввод

CREATE TABLE #Table (
   RelatedPolimorphicId int,
   [Key] nvarchar(50),
   [Value] varchar(max)
)
INSERT INTO #Table
   (RelatedPolimorphicId, [Key], [Value])
VALUES
   (23, N'ContentStats', N'{"BrandPresent": true, "OneImage": true, "UPCPresenet": true, "ModelNumberPresent": true, "TitlePresent": true, "DescriptionPresent": true, "Feature1Present": true}')

Оператор

SELECT 
   t.RelatedPolimorphicId,
   j.*
FROM #Table t
CROSS APPLY (
   SELECT * 
   FROM OPENJSON(t.[Value])
   WITH (
       BrandPresent varchar(10) '$.BrandPresent',
       OneImage varchar(10) '$.OneImage',
       UPCPresenet varchar(10) '$.UPCPresenet',
       ModelNumberPresent varchar(10) '$.ModelNumberPresent',
       TitlePresent varchar(10) '$.TitlePresent',
       DescriptionPresent varchar(10) '$.TitlePresent',
       Feature1Present varchar(10) '$.Feature1Present'
   )
) j

Выход

RelatedPolimorphicId    BrandPresent    OneImage    UPCPresenet ModelNumberPresent  TitlePresent    DescriptionPresent  Feature1Present
23                      true            true        true        true              true              true            true
1 голос
/ 28 марта 2019

Я бы попробовал этот подход

SELECT t.RelatedPolimorphicId
      ,t.[Key] 
      ,A.*
FROM YourMetaDataTable t
CROSS APPLY OPENJSON(t.[Value]) 
WITH (
     BrandPresent BIT
    ,OneImage BIT
    ,UPCPresenet BIT
    ,ModelNumberPresent BIT
    ,TitlePresent BIT
    ,DescriptionPresent BIT
    ,Feature1Present BIT
) A;

OPENJSON в сочетании с предложением WITH предлагает хороший, чистый и безопасный для типов (!) Подход к чтению вашего JSON. Я бы использовал BIT, потому что true и false будут переведены неявно.

0 голосов
/ 28 марта 2019

Спасибо всем за отклик.@shnugo, в вашем решении с openjson решение все равно должно перечислять все ключи, которые я хотел проанализировать, я решил это с помощью JSON_query, более простого решения, но проблема в том, что у меня есть более 40 ключей для анализа, что неэффективноперечислить их по одному.Я искал функцию, которая может анализировать столбец JSON без необходимости указывать каждый ключ в строке JSON.

решение с json_query

0 голосов
/ 28 марта 2019

Пожалуйста, попробуйте это:

SELECT p.RelatedPolymorphId,p.[BrandPresent],p.[OneImage],p.[UPCPresent],p.[ModelNumberPresent],p.[TitlePresent],p.[DescriptionPresent],p.[Feature1Present]
FROM (SELECT v.RelatedPolymorphId,v.Value AS [JsonValue] FROM [YourTableName] v) a
CROSS APPLY OPENJSON(a.JsonValue) j
PIVOT(MAX(j.[value]) FOR j.[key] IN ([BrandPresent],[OneImage],[UPCPresent],[ModelNumberPresent],[TitlePresent],[DescriptionPresent],[Feature1Present])) p
;
...