簡體   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