繁体   English   中英

在 JSON 中添加一系列(已知的)嵌套 arrays 提取到 SQL

[英]Add a series of (known) nested arrays in a JSON extract into SQL

我以以下 JSON 为例:

[{"UserDetails":[{"UserName":"Mr John Smith","UserDateOfBirth":"22/05/59","UserID":"ABC123","NotesDay1":[],"NotesDay2":[],"NotesDay3":[{"NoteID":"NI9199","Note":null}],"NotesDay4":[],"NotesDay5":[],"NotesDay6":[],"NotesDay7":[{"NoteID":"NI3423","Note":"Tried to contact, will try again later"}]}]}]

格式是在 UserDetails 数组中有许多用户(在本例中只有一个),在每个用户 object 中有 7 个 arrays 称为 NotesDay1 到 NotesDay7。 一些用户将在 NotesDayX 中拥有一个或多个对象,而有时则没有。

想要的output如下:

USER         NoteID
ABC123       NI9199
ABC123       NI3243

ETC

这 7 天内的每个用户都需要以这种方式显示。 在此关头包含我自己的任何代码似乎毫无意义,因为它目前不起作用。

谁能帮忙?

提前致谢。

一种可能的方法是使用变量作为第二次OPENJSON()调用的path参数值(需要 SQL Server 2017):

JSON:

DECLARE @json nvarchar(max) = N'
  [
     {"UserDetails": [
        {"UserName":"Mr John Smith","UserDateOfBirth":"22/05/59","UserID":"ABC123","NotesDay1":[],"NotesDay2":[],"NotesDay3":[{"NoteID":"NI9199","Note":null}],"NotesDay4":[],"NotesDay5":[],"NotesDay6":[],"NotesDay7":[{"NoteID":"NI3423","Note":"Tried to contact, will try again later"}]}, 
        {"UserName":"Mr John Smith 2","UserDateOfBirth":"22/05/59","UserID":"ABC124","NotesDay1":[],"NotesDay2":[],"NotesDay3":[{"NoteID":"NI9199","Note":null}],"NotesDay4":[],"NotesDay5":[],"NotesDay6":[],"NotesDay7":[{"NoteID":"NI3423","Note":"Tried to contact, will try again later"}]}]
     }
  ]'

声明:

SELECT JSON_VALUE(j.[value], '$.UserID') AS [UserId], a.NoteId
FROM OPENJSON(@json, '$[0].UserDetails') j
CROSS APPLY (VALUES (1), (2), (3), (4), (5), (6), (7) ) v (n)
CROSS APPLY OPENJSON(j.[value], CONCAT('$.NotesDay', v.n)) WITH (
   NoteId nvarchar(10) '$.NoteID'
) a

结果:

用户身份 笔记编号
ABC123 NI9199
ABC124 NI9199
ABC123 NI3423
ABC124 NI3423

我们使用CROSS APPLY / OPENJSON来剥洋葱:

SELECT UserID, NoteID
FROM OPENJSON(@json, '$[0].UserDetails')
WITH (
    UserID NVARCHAR(50),
    Details NVARCHAR(MAX) '$' AS JSON
)
CROSS APPLY (
    SELECT [value] AS [notes]
    FROM OPENJSON(Details)
    WHERE [key] LIKE 'NotesDay%'
) _
CROSS APPLY OPENJSON([notes])
WITH (
    NoteID NVARCHAR(50)
)

请注意,此解决方案不关心有多少天,它适用于 SQL Server 2016。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM