SQL JSON PATH 如何在从较大的 json 集中提取后按索引访问 json 数组

Posted

技术标签:

【中文标题】SQL JSON PATH 如何在从较大的 json 集中提取后按索引访问 json 数组【英文标题】:SQL JSON PATH How to access a json array by index after extracting from a larger json set 【发布时间】:2019-01-22 21:28:05 【问题描述】:

可能是一个糟糕的标题。道歉。我正在处理大量带有嵌套数组的 json 数据,这些数组通常没有名称。我正在尝试提取部分数据,然后通过数组偏移量访问它。

以行形式返回数组数据的示例

DECLARE @json NVARCHAR(MAX)
SET @json =  
N'[  
        "id" : 2,"info":  "name": "John", "surname": "Smith" , "age": 25 ,  
        "id" : 5,"info":  "name": "Jane", "surname": "Smith", "skills": [["SQL", "C#", "Azure"],["ABC","DEF","BLASH"]] , "dob": "2005-11-04T12:00:00"   
 ]'  

SELECT  arr 
FROM OPENJSON(@json)  
  WITH (id int 'strict $.id',  
        firstName nvarchar(50) '$.info.name', lastName nvarchar(50) '$.info.surname',  
        age int, dateOfBirth datetime2 '$.dob',
    skillarr nvarchar(max) '$.info.skills' as json) 

    cross apply openjson( skillarr ) with ( arr nvarchar(MAX) '$' AS JSON )

这将返回 [“SQL”、“C#”、“Azure”] ["ABC","DEF","BLASH"]

但我想只返回每个数组子集的第一个元素。 IE “SQL” “ABC”

我尝试了第二次交叉应用,但无法弄清楚路径约定

将 openjson (arr) 与 (firstskill nvarchar(10) '$.[0]') 交叉应用

无效。有人知道我是如何通过索引访问未命名数据的吗?

谢谢

【问题讨论】:

您好,我认为这篇文章和示例可以帮助您:***.com/a/54233113/9940803 谢谢。对我来说问题似乎是我的数组数据没有名称:值结构,而只是值。在示例中,您指出所有元素都具有全名 : value paring 并且可以从 json 路径访问。在链接的示例中,我可以执行 $.attributes[0]' 并按名称访问第一个数组元素,在我的情况下,我没有名称部分。 答案对你正在寻找的有反应? 【参考方案1】:

您好,我认为这个查询可以响应:

DECLARE @json NVARCHAR(MAX)
SET @json =  
N'[  
        "id" : 2,"info":  "name": "John", "surname": "Smith" , "age": 25 ,  
        "id" : 5,"info":  "name": "Jane", "surname": "Smith", "skills": [["SQL", "C#", "Azure"],["ABC","DEF","BLASH"]] , "dob": "2005-11-04T12:00:00"   
 ]'  

SELECT  /*id,*/ a /*,arr*/
FROM OPENJSON(@json)  
  WITH (id int 'strict $.id',  
        firstName nvarchar(50) '$.info.name', lastName nvarchar(50) '$.info.surname',  
        age int, dateOfBirth datetime2 '$.dob',
    skillarr nvarchar(max) '$.info.skills' as json) 

    cross apply openjson( skillarr ) with ( arr nvarchar(MAX) '$' AS JSON)
    cross apply openjson( arr ) with (a nvarchar(MAX) '$')

结果是:

a
SQL
C#
Azure
ABC
DEF
BLASH

为了获得第一个技能,你必须在交叉应用中看到 row_number 或 mock id,我认为有可能找到你例外的方法。

我认为这个查询可以工作:

DECLARE @json NVARCHAR(MAX)
SET @json =  
N'[  
        "id" : 2,"info":  "name": "John", "surname": "Smith" , "age": 25 ,  
        "id" : 5,"info":  "name": "Jane", "surname": "Smith", "skills": [["SQL", "C#", "Azure"],["ABC","DEF","BLASH"]] , "dob": "2005-11-04T12:00:00"   
 ]'  

SELECT SUBJSONPARSER.First_Skill 
FROM (
    SELECT  /*id,*/ a as 'First_Skill' /*,arr*/, ROW_NUMBER() OVER(Partition by arr ORDER BY arr) AS 'Row_Number'
    FROM OPENJSON(@json)  
      WITH (id int 'strict $.id',  
            firstName nvarchar(50) '$.info.name', lastName nvarchar(50) '$.info.surname',  
            age int, dateOfBirth datetime2 '$.dob',
        skillarr nvarchar(max) '$.info.skills' as json) 
        cross apply openjson( skillarr ) with ( arr nvarchar(MAX) '$' AS JSON)
        cross apply openjson(arr) with (a nvarchar(MAX) '$') ) SUBJSONPARSER
WHERE SUBJSONPARSER.Row_Number = 1

结果:

First_Skill
ABC
SQL

【讨论】:

谢谢帕斯卡,这就是我想要完成的!

以上是关于SQL JSON PATH 如何在从较大的 json 集中提取后按索引访问 json 数组的主要内容,如果未能解决你的问题,请参考以下文章

phpMyAdmin 内部服务器错误 500 - JSON 无效

SQL中Json操作

JSON with C program

json格式数据转sql语句

如何在从根遍历到json树的目标节点时插入键?

如何在从列表更新路径的for循环中读取多个json? [复制]