我正在嘗試從存盤在 SQL Server 資料庫中的 JSON 陣列中提取一些資訊。我可以看到我需要使用 OPENJSON,并且我找到了許多如何使用它的示例,但問題是所有示例都演示了將單個 JSON 陣列宣告為變數并使用 OPENJSON 打開它(例如如何閱讀使用 SQL Server 2016 中的 OPENJSON 在 Json 中帶空格的欄位名稱)。我想知道如何將其實際構建到資料庫查詢中。
資料庫表結構示例:
表:HELP_INFO
| 用戶識別符號 | ID | JSON |
|---|---|---|
| 1 | 45745 | JSON varchar - 下面的示例 |
| 2 | 45745 | JSON varchar - 下面的示例 |
| 3 | 82567 | JSON varchar - 下面的示例 |
JSON的示例結構
Example 1
{"source":"XYZ",
"source_info":{
"type":"need_help",
"help_info":{
"questions":50,
"details":[{"floatv":0.42,"name":"Tom"},{"floatv":1.08,"name":"Dick"},{"floatv":1.2,"name":"Harry"}]}}}
Example 2
{"source":"XYZ",
"source_info":{
"type":"need_help",
"help_info":{
"questions":12,
"details":[{"floatv":2.0,"name":"Donald"},{"floatv":0.4,"name":"Mickey"}]}}}
對于表中的每一行,我需要打開 JSON 中的“詳細資訊”串列并提取所有“名稱”值。詳細資訊串列中的專案始終具有相同的鍵,但串列中的專案數量會有所不同。
我將如何撰寫查詢來執行此操作,從 HELP_INFO 表的行中獲取源 JSON 值及其 ID?
期望的輸出:
| 用戶識別符號 | 名稱 |
|---|---|
| 45745 | 湯姆迪克哈利 |
| 45745 | 唐納德·米奇 |
| 82567 | 其他名稱 |
謝謝
uj5u.com熱心網友回復:
您需要OPENJSON()使用適當的呼叫path來訪問嵌套的$.source_info.help_info.detailsJSON 陣列并STRING_AGG()聚合名稱:
樣本資料:
SELECT *
INTO Data
FROM (VALUES
(1, 45745, '{"source":"XYZ",
"source_info":{
"type":"need_help",
"help_info":{
"questions":50,
"details":[{"floatv":0.42,"name":"Tom"},{"floatv":1.08,"name":"Dick"},{"floatv":1.2,"name":"Harry"}]}}}')
) v (UID, ID, JSON)
陳述:
SELECT
ID,
NAMES = (
SELECT STRING_AGG(JSON_VALUE([value], '$.name'), ' ')
WITHIN GROUP (ORDER BY CONVERT(int, [key]))
FROM OPENJSON(JSON, '$.source_info.help_info.details')
)
FROM Data
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/456857.html
