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 数组的主要内容,如果未能解决你的问题,请参考以下文章