【问题标题】:Transform JSON data to separate columns将 JSON 数据转换为单独的列
【发布时间】:2015-11-05 16:51:40
【问题描述】:

我有以下数据库结构:

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 的方法

【问题讨论】:

  • 你想做什么?你想将此 json 结构导入 SQL Server 表还是什么?
  • 我需要编写一个查询来从列中提取 JSON,并动态创建列。描述中的所有细节。谢谢!
  • 应该可以使用 SQL Server 2016 afaik JSON Support in SQL Server 2016
  • Parse JSON in TSQL的可能重复
  • 关于转换有一个具体的问题,它不像上面的链接那么普遍。如果我错了,请纠正我

标签: sql sql-server json database


【解决方案1】:

在 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 中返回哪些字段。作为替代方案,您可以使用不带 WITH 子句的 openjson 从 JSON 对象动态返回所有键:值对:

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

在此版本中,OPENJSON 将返回透视值。 key:value 对不会作为 column: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() 函数。

【讨论】:

    【解决方案2】:

    看看这篇文章是否对您有帮助,让我们知道

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

    【讨论】:

    • 谢谢!现在对我来说主要的困难问题是迭代每行的异构 JSON 内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2015-09-30
    • 2018-01-31
    • 1970-01-01
    相关资源
    最近更新 更多