我有以下数据库结构:
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,并动态创建列,我想为不同的列执行此操作对列名name
,icon
,twitter
,facebook
进行硬编码。所以我正在寻找的结果如下:
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的方法
答案 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/