這是我的問題:我的 JSON 可能會根據 API 回應而有所不同,并且不能保證下次有發布請求時我的 JSON 中會出現“shortTitle”。我必須弄清楚如何通過 JSON “回圈”(如果這是正確的術語)以獲取所有 fieldID 和內容而不會丟失任何資料。
這是查詢:
DECLARE
// hardcoded json to simulate a post request
@json nvarchar(max) = '{
"itemTypeID": 13,
"authorRights": {
"fieldID": 15,
"content": "abcd"
},
"language": {
"fieldID": 7,
"content": "abcd"
},
"url": {
"fieldID": 13,
"content": "abcd"
},
"shortTitle": {
"fieldID": 8,
"content": "abcd"
},
"data": {
"fieldID": 6,
"content": "2022-03-02"
},
"summary": {
"fieldID": 2,
"content": "abcd"
},
"subject": {
"fieldID": 60,
"content": "abcd"
}
}';
BEGIN
SELECT* FROM OPENJSON(@json)
WITH(
fieldID bigint '$.data.fieldID',
content nvarchar(255) '$.data.content'
)
END;
此查詢僅回傳“資料”(結果)的 fieldID 和內容。如何回傳所有物件的 fieldID 和內容?
uj5u.com熱心網友回復:
如果我正確理解了輸入 JSON 的結構,您只需要決議嵌套的 JSON 物件。因此,使用OPENJSON()默認模式和附加APPLY運算子是解決您問題的可能方法。正如檔案中所解釋的,具有默認模式的OPENJSON()函式回傳一個包含列的表key,value和type,并且該type列包含一個包含回傳值型別的 int 值。
SELECT j1.[key], j2.fieldID
FROM OPENJSON(@json) j1
CROSS APPLY OPENJSON (j1.[value]) WITH (fieldID bigint '$.fieldID') j2
WHERE j1.[type] = 5
結果:
key fieldID
---------------------
authorRights 15
language 7
url 13
shortTitle 8
data 6
summary 2
subject 60
uj5u.com熱心網友回復:
嗨,您必須明確列舉所有所需的列:
SELECT* FROM OPENJSON(@json)
WITH(
authorRights_fieldID bigint '$.authorRights.fieldID',
authorRights_content nvarchar(255) '$.authorRights.content',
data_fieldID bigint '$.data.fieldID',
data_content nvarchar(255) '$.data.content',
-- ...
subject_fieldID bigint '$.subject.fieldID',
subject_content nvarchar(255) '$.subject.content',
)
而不是...填充其他元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/448927.html
上一篇:獲取同一行上3列之間的MIN值
