首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用TSQL将JSON列解析为表

如何使用TSQL将JSON列解析为表
EN

Stack Overflow用户
提问于 2019-03-28 06:45:14
回答 4查看 5K关注 0票数 5

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

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-03-28 18:05:51

我会尝试这种方法

代码语言:javascript
运行
复制
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,因为truefalse将被隐式转换。

票数 7
EN

Stack Overflow用户

发布于 2019-03-28 14:53:49

您可以尝试下一种方法,使用OPENJSON()WITH子句(指定列及其类型)。如果没有WITH子句,OPENJSON将返回三列-每个{key: value}对的keyvaluetype

输入

代码语言:javascript
运行
复制
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}')

语句

代码语言:javascript
运行
复制
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

输出

代码语言:javascript
运行
复制
RelatedPolimorphicId    BrandPresent    OneImage    UPCPresenet ModelNumberPresent  TitlePresent    DescriptionPresent  Feature1Present
23                      true            true        true        true              true              true            true
票数 3
EN

Stack Overflow用户

发布于 2019-03-28 11:54:36

请尝试这个:

代码语言:javascript
运行
复制
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
;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55387607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档