我正在尝试打开JSON字符串,并将每个键作为其自己的列。 JSON列位于具有键和多态ID的元数据表中。
我希望能够将每个键解析为其自己的列,并为每个多态ID填充相应的值。
我可以使用json_query解析每个键,但是我看到有一个函数openjson可以解析整个字符串,但是我不知道如何使用它,因为文档中的示例正在应用该函数设置值而不是表中的列。是否有比使用json_query更简单的解析JSON字符串的方法?
答案 0 :(得分:1)
您可以尝试使用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 :(得分: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
,因为BIT
和true
将被隐式翻译。
答案 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字符串中指定每个键的函数。