在達夢數據庫(DM Database)中,將 JSON 數據轉換為表格形式可以使用內置的 JSON_TABLE
函數。以下是詳細步驟和示例:
1. 核心函數:JSON_TABLE
JSON_TABLE
用于將 JSON 數據解析為關系表結構,支持從 JSON 對象或數組中提取數據。
語法:
SELECT *
FROM JSON_TABLE(json_doc, -- JSON 字符串或 JSON 列path -- JSON 路徑(指定要解析的部分)COLUMNS (列名1 數據類型 PATH '字段路徑1' [ERROR | NULL ON ERROR],列名2 數據類型 PATH '字段路徑2' [TRIM | DEFAULT 默認值 ON EMPTY],... )
) AS 別名;
2. 示例演示
示例 1:解析 JSON 數組
假設 JSON 數據如下:
[{"id": 1, "name": "Alice", "age": 25},{"id": 2, "name": "Bob", "age": 30}
]
查詢語句:
SELECT *
FROM JSON_TABLE('[{"id":1,"name":"Alice","age":25},{"id":2,"name":"Bob","age":30}]','$[*]' -- 解析根數組的所有元素COLUMNS (id INT PATH '$.id',name VARCHAR(50) PATH '$.name',age INT PATH '$.age')
) AS jt;
結果:
ID | NAME | AGE |
---|---|---|
1 | Alice | 25 |
2 | Bob | 30 |
示例 2:解析嵌套 JSON
假設 JSON 數據:
{"dept": "IT","employees": [{"id": 101, "name": "Tom"},{"id": 102, "name": "Jerry"}]
}
查詢語句:
SELECT *
FROM JSON_TABLE('{"dept":"IT","employees":[{"id":101,"name":"Tom"},{"id":102,"name":"Jerry"}]}','$.employees[*]' -- 解析 employees 數組COLUMNS (dept VARCHAR(10) PATH '$.dept', -- 注意:此處需用根路徑id INT PATH '$.id',name VARCHAR(50) PATH '$.name')
) AS jt;
修復路徑后的正確寫法:
SELECT jt.*,JSON_VALUE(原JSON字段, '$.dept') AS dept -- 額外提取部門
FROM JSON_TABLE('{"dept":"IT","employees":[{"id":101,"name":"Tom"},{"id":102,"name":"Jerry"}]}','$.employees[*]'COLUMNS (id INT PATH '$.id',name VARCHAR(50) PATH '$.name')
) AS jt;
3. 處理空值/錯誤
NULL ON EMPTY
:路徑不存在時返回NULL
DEFAULT 值 ON EMPTY
:路徑不存在時返回默認值ERROR ON ERROR
:轉換錯誤時報錯(默認行為)
示例:
SELECT *
FROM JSON_TABLE('[{"id":1,"score":"90"},{"id":2}]','$[*]'COLUMNS (id INT PATH '$.id',score INT PATH '$.score' DEFAULT -1 ON EMPTY -- 缺失時返回 -1)
) AS jt;
結果:
ID | SCORE |
---|---|
1 | 90 |
2 | -1 |
4. 從表中讀取 JSON 列
若 JSON 數據存儲在表的列中(如 user_data JSON
):
SELECT jt.*
FROM your_table,
JSON_TABLE(your_table.json_column, -- 直接引用 JSON 列'$.employees[*]'COLUMNS (id INT PATH '$.id',name VARCHAR(100) PATH '$.name')
) AS jt;
5. 復雜路徑處理
解析多層嵌套 JSON:
{"project": "X","tasks": [{"task_id": 1,"details": {"owner": "Amy", "priority": "high"}}]
}
查詢:
SELECT *
FROM JSON_TABLE('{"project":"X","tasks":[{"task_id":1,"details":{"owner":"Amy","priority":"high"}}]}','$.tasks[*]'COLUMNS (project VARCHAR(10) PATH '$.project',task_id INT PATH '$.task_id',owner VARCHAR(20) PATH '$.details.owner',priority VARCHAR(10) PATH '$.details.priority')
) AS jt;
注意事項:
- 路徑語法:使用
$
表示根,.
訪問屬性,[*]
遍歷數組。 - 版本兼容:確保達夢數據庫版本支持
JSON_TABLE
(DM 8.0 及以上通常支持)。 - 性能:處理大 JSON 時注意性能,避免全表掃描。
通過以上方法,可靈活地將 JSON 數據轉換為表格結構,便于 SQL 查詢和分析。