我正在尝试打开一个JSON字符串,并让每个键成为它自己的列。JSON列位于具有键和多态id的元数据表中。

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

我可以用json_query逐个解析每个键,但是我看到有一个函数调用openjson,它可以解析整个字符串,但我不知道如何使用它,因为文档中的示例是在设置值上应用函数,而不是在表中的列上应用函数。有没有比使用json_query更简单的解析JSON字符串的方法呢?
发布于 2019-03-28 18:05:51
我会尝试这种方法
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;与WITH子句相关的OPENJSON提供了一个漂亮、干净且类型安全的(!)读取JSON的方法。我使用BIT,因为true和false将被隐式转换。
发布于 2019-03-28 14:53:49
您可以尝试下一种方法,使用OPENJSON()和WITH子句(指定列及其类型)。如果没有WITH子句,OPENJSON将返回三列-每个{key: value}对的key、value和type。
输入
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发布于 2019-03-28 11:54:36
请尝试这个:
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
;https://stackoverflow.com/questions/55387607
复制相似问题