UNNEST()

函数说明

UNNEST 函数用于将 JSON 类型数据内的数组类型的列或参数展开为一个表。它将 JSON 类型数据中的数组中的元素拆分成单独的行,使得可以对数组元素进行单独的处理或与其他表进行连接操作。

当输入空数组时,UNNEST 函数返回空表,因为没有元素可以展开。

当输入 NULL 值时,UNNEST 函数返回空表,因为 NULL 不是一个有效的数组。

函数语法

1. > UNNEST(array_expression)

参数释义

参数 说明
array_expression 必要参数。是一个 JSON 数据内的数组,可以是数组列、数组常量或数组函数的返回值。

示例

  • 示例 1:
1. -- 将一个包含 JSON 对象的字符串数组进行展开,'{"a":1}' 是一个包含单个元素的字符串数组。这个元素是一个表示 JSON 对象的字符串。
2. > select * from unnest('{"a":1}') u;
3. +----------------+------+------+------+-------+-------+----------+
4. | col            | seq  | key  | path | index | value | this     |
5. +----------------+------+------+------+-------+-------+----------+
6. | UNNEST_DEFAULT |    0 | a    | $.a  |  NULL | 1     | {"a": 1} |
7. +----------------+------+------+------+-------+-------+----------+
8. 1 row in set (0.00 sec)

10. -- 对一个包含整数的字符串数组 '[1,2,3]' 进行展开,并使用别名 u 代表展开后的列。
11. > select * from unnest('[1,2,3]') u;
12. +----------------+------+------+------+-------+-------+-----------+
13. | col            | seq  | key  | path | index | value | this      |
14. +----------------+------+------+------+-------+-------+-----------+
15. | UNNEST_DEFAULT |    0 | NULL | $[0] |     0 | 1     | [1, 2, 3] |
16. | UNNEST_DEFAULT |    0 | NULL | $[1] |     1 | 2     | [1, 2, 3] |
17. | UNNEST_DEFAULT |    0 | NULL | $[2] |     2 | 3     | [1, 2, 3] |
18. +----------------+------+------+------+-------+-------+-----------+
19. 3 rows in set (0.00 sec)

21. -- 对一个包含整数的字符串数组 '[1,2,3]' 进行展开,并选择数组的第一个元素作为结果集的一部分返回。'$[0]' 是一个指定要选择的数组元素的路径表达式,true 是一个指示是否返回路径的布尔值,并使用别名 u 代表展开后的列。
22. > select * from unnest('[1,2,3]','$[0]',true) u;
23. +----------------+------+------+------+-------+-------+------+
24. | col            | seq  | key  | path | index | value | this |
25. +----------------+------+------+------+-------+-------+------+
26. | UNNEST_DEFAULT |    0 | NULL | $[0] |  NULL | NULL  | 1    |
27. +----------------+------+------+------+-------+-------+------+
28. 1 row in set (0.00 sec)
  • 示例 2:
1. create table t1 (a json,b int);
2. insert into t1 values ('{"a":1,"b":[{"c":2,"d":3},false,4],"e":{"f":true,"g":[null,true,1.1]}}',1);
3. insert into t1 values ('[1,true,false,null,"aaa",1.1,{"t":false}]',2);
4. > select * from t1;
5. +---------------------------------------------------------------------------------------+------+
6. | a                                                                                     | b    |
7. +---------------------------------------------------------------------------------------+------+
8. | {"a": 1, "b": [{"c": 2, "d": 3}, false, 4], "e": {"f": true, "g": [null, true, 1.1]}} |    1 |
9. | [1, true, false, null, "aaa", 1.1, {"t": false}]                                      |    2 |
10. +---------------------------------------------------------------------------------------+------+
11. 2 rows in set (0.00 sec)

13. -- 从表 t1 中展开数组 t1.a 的元素,并选择展开后的元素作为结果集的一部分返回。"$a" 是一个指定要选择的数组元素的路径表达式;true 是一个指示是否返回路径的布尔值;使用 f.* 表示选择展开后的所有列;f 是 UNNEST 函数的别名,代表展开后的结果
14. mysql> select f.* from t1,unnest(t1.a, "$.a", true) as f;
15. +------+------+------+------+-------+-------+------+
16. | col  | seq  | key  | path | index | value | this |
17. +------+------+------+------+-------+-------+------+
18. | t1.a |    0 | NULL | $.a  |  NULL | NULL  | 1    |
19. | t1.a |    0 | NULL | $.a  |  NULL | NULL  | 1    |
20. +------+------+------+------+-------+-------+------+
21. 2 rows in set (0.00 sec)