使用 Sql Server 2016 的 OPENJSON 函数从 Json 文档中的多个数组元素中选择结果

Posted

技术标签:

【中文标题】使用 Sql Server 2016 的 OPENJSON 函数从 Json 文档中的多个数组元素中选择结果【英文标题】:Select results from multiple array elements in Json document with Sql Server 2016's OPENJSON function 【发布时间】:2017-07-31 22:09:06 【问题描述】:

是否可以在 Sql Server 2016 中将来自多个数组元素的部分 json 文档组合成单个结果?

鉴于此 json:


  "fruit": 
    "types": [
      
        "possible": [ "Apples", "Bananas", "Pears" ],
        "category": "Basic"
      ,
      
        "possible": [ "Oranges", "Grapefruit", "Lemons", "Limes" ],
        "category": "Citrus"
      ,
      
        "possible": [ "Blueberries", "Strawberries", "Cherries" ],
        "category": "Berries"
      
    ]
  

我想查看可能元素中所有值的单一结果:

results
-----
Apples
Bananas
Pears
Oranges
Grapefruit
Lemons
Limes
Blueberries
Strawberries
Cherries

我已经接近这样做了:

SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.fruit.types[0].possible'))
UNION
SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.fruit.types[1].possible'))
UNION
SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.fruit.types[2].possible'))

但这依赖于将查询与数组中的元素数量联系起来。 有没有办法不必单独指定每个数组元素?像这样的东西(这些都不是有效的表达方式):

SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.fruit.types[].possible'))

SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.fruit.types.possible'))

这是我应该做交叉申请的地方吗?

【问题讨论】:

【参考方案1】:

这是我应该做交叉申请的地方吗?

是的。

declare @json nvarchar(max)='

  "fruit": 
    "types": [
      
        "possible": [ "Apples", "Bananas", "Pears" ],
        "category": "Basic"
      ,
      
        "possible": [ "Oranges", "Grapefruit", "Lemons", "Limes" ],
        "category": "Citrus"
      ,
      
        "possible": [ "Blueberries", "Strawberries", "Cherries" ],
        "category": "Berries"
      
    ]
  

'

select v.value
from openjson(@json, '$.fruit.types') t
cross apply openjson(t.value,'$.possible') v

输出

value
---------
Apples
Bananas
Pears
Oranges
Grapefruit
Lemons
Limes
Blueberries
Strawberries
Cherries

(10 row(s) affected)

【讨论】:

太棒了。谢谢。

以上是关于使用 Sql Server 2016 的 OPENJSON 函数从 Json 文档中的多个数组元素中选择结果的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQLBulkCopy - SQL Server 2016 中的表比 SQL Server 2014 中的表大得多

SQL Server 2008 R2 安装出错:Could not open key

sql server2016怎么转换成2019的格式

Azure SQL Database (20) 使用SQL Server 2016 Upgrade Advisor

如何将 SQL Server 2008 R2 SSIS 包升级到 SQL Server 2016?

server 2008 r2能安装sql server 2016吗?