同时展开两个json数组字段a,b
id | a | b |
---|---|---|
1 | [1,2,3] | [11, 22] |
2 | [4,5] | “null” |
3 | [6,7] | NULL |
4 | [8,9] | [] |
SELECT
* FROM
JSON_TABLE(a, '$' COLUMNS(
NESTED PATH '$[*]' COLUMNS(
unfold_a int PATH '$'
)
)) t1,
JSON_TABLE(b, '$' COLUMNS(
NESTED PATH '$[*]' COLUMNS(
unfold_b int PATH '$'
)
)) t2
结果为
id | unfold_a | unfold_b |
---|---|---|
1 | 3 | 11 |
1 | 2 | 11 |
1 | 1 | 11 |
1 | 3 | 22 |
1 | 2 | 22 |
1 | 1 | 22 |
2 | 4 | NULL |
2 | 5 | NULL |
4 | 8 | NULL |
4 | 9 | NULL |
并不是我们想要的,丢失了id为3的数据,
json_table无法将NULL数据(非json的’null’)展开,
可以展开json的’null’和空数组[],
所以需要对NULL处理:
SELECT
* FROM
JSON_TABLE(IFNULL(a, 'null'), '$' COLUMNS(
NESTED PATH '$[*]' COLUMNS(
unfold_a int PATH '$'
)
)) t1,
JSON_TABLE(IFNULL(b, 'null'), '$' COLUMNS(
NESTED PATH '$[*]' COLUMNS(
unfold_b int PATH '$'
)
)) t2
结果为
id | unfold_a | unfold_b |
---|---|---|
1 | 3 | 11 |
1 | 2 | 11 |
1 | 1 | 11 |
1 | 3 | 22 |
1 | 2 | 22 |
1 | 1 | 22 |
2 | 4 | NULL |
2 | 5 | NULL |
3 | 6 | NULL |
3 | 7 | NULL |
4 | 8 | NULL |
4 | 9 | NULL |
参考资料:
https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html#function_json-table
https://dev.mysql.com/doc/refman/8.0/en/flow-control-functions.html#function_ifnull