如何使用TSQL将JSON列解析到表

时间:2019-03-27 22:45:14

标签: json sql-server sql-server-2016

我正在尝试打开JSON字符串,并将每个键作为其自己的列。 JSON列位于具有键和多态ID的元数据表中。

enter image description here

我希望能够将每个键解析为其自己的列,并为每个多态ID填充相应的值。

enter image description here

我可以使用json_query解析每个键,但是我看到有一个函数openjson可以解析整个字符串,但是我不知道如何使用它,因为文档中的示例正在应用该函数设置值而不是表中的列。是否有比使用json_query更简单的解析JSON字符串的方法?

4 个答案:

答案 0 :(得分:1)

您可以尝试使用OPENJSON()WITH子句(指定列及其类型)的下一种方法。如果没有WITH子句,则OPENJSON会返回三列-每对key中的valuetype{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 :(得分:1)

我会尝试这种方法

files
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提供了一种不错的,干净的,类型安全的(!)方法来读取JSON。我会使用WITH,因为BITtrue将被隐式翻译。

答案 2 :(得分:0)

请尝试以下操作:

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
;

答案 3 :(得分:0)

感谢大家的回应。 @shnugo,在您使用openjson的解决方案中,该解决方案仍然必须列出我要解析的每个键,我已经使用JSON_query(一个更简单的解决方案)解决了它,但是问题是我要解析40多个键,效率低下逐一列出。我一直在寻找一个可以解析JSON列而不必在JSON字符串中指定每个键的函数。

solution with json_query