[英]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.