将JSON数据转换为单独的列

时间:2015-11-04 11:39:23

标签: sql sql-server json database

我有以下数据库结构:

ID  Name  Value
1   TV1   {"URL": "www.url.com", "Icon": "some_icon"}
2   TV2   {"URL": "www.url.com", "Icon": "some_icon", "Facebook": "Facebook_URL"}
3   TV3   {"URL": "www.url.com", "Icon": "some_icon", "Twitter": "Twitter_URL"}
..........

我正在寻找一个使用SQL Server 2012的本机函数的查询来从列Value中提取JSON,并动态创建列,我想为不同的列执行此操作对列名nameicontwitterfacebook 进行硬编码。所以我正在寻找的结果如下:

ID  Name  URL          Icon           Facebook      Twitter
1   TV1   www.url.com  some_icon          NULL         NULL
2   TV2   www.url.com  some_icon  Facebook_URL         NULL
3   TV3   www.url.com  some_icon          NULL  Twitter_URL

如果使用本机SQL Server机制无法做到这一点,可能PostgreSQL可以这样做,或者其他RMDBS

PS。我的问题不是Parse JSON in TSQL的重复。我需要找出解析行中异构json的方法

2 个答案:

答案 0 :(得分:8)

在SQL Server 2016中,您可以在打开json时在查询时定义模式:

select id, name, url, icon, facebook, twitter
from tab
     cross apply openjson(value) 
                 with (url nvarchar(100), icon varbinary,
                       facebook nvarchar(100),twitter nvarchar(100))

请注意,您不能拥有动态返回架构 - 您需要指定应在TVF中返回哪些字段。作为替代方法,您可以使用openjson without WITH子句从JSON对象动态返回所有key:value对:

select id, name, json.[key], json.value
from tab
     cross apply openjson(value) as json

在此版本中,OPENJSON将返回旋转值。 key:值对不会作为列返回:cell - 每个key:value对将在单独的行中返回:

ID Name key      value
1  TV1  URL      www.url.com
1  TV1  Icon     some_icon
2  TV2  URL      www.url.com
2  TV2  Icon     some_icon
2  TV3  Facebook Facebook_URL
3  TV3  URL      www.url.com
3  TV3  Icon     some_icon
3  TV3  Twitter  Twitter_URL
....

这也将很快在Azure SQL数据库中提供。在早期版本中,您需要查找或编写一些解析JSON或使用一些非常复杂的T-SQL的CLR TVF。如果你想使用现有的CLR解决方案,我可以推荐JsonSelect和json4sql。 旧版SQL Server的其他替代方法是使用XML而不是JSON并使用nodes()函数。

答案 1 :(得分:0)

看一下,如果这篇文章可以帮到你,请告诉我们

https://www.simple-talk.com/blogs/2013/03/26/sql-server-json-to-table-and-table-to-json/

相关问题