UNNEST()
函数说明
UNNEST
函数用于将 JSON 类型数据内的数组类型的列或参数展开为一个表。它将 JSON 类型数据中的数组中的元素拆分成单独的行,使得可以对数组元素进行单独的处理或与其他表进行连接操作。
当输入空数组时,UNNEST
函数返回空表,因为没有元素可以展开。
当输入 NULL
值时,UNNEST
函数返回空表,因为 NULL
不是一个有效的数组。
函数语法
> UNNEST(array_expression)
参数释义
参数 | 说明 |
---|---|
array_expression | 必要参数。是一个 JSON 数据内的数组,可以是数组列、数组常量或数组函数的返回值。 |
示例
- 示例 1:
-- 将一个包含 JSON 对象的字符串数组进行展开,'{"a":1}' 是一个包含单个元素的字符串数组。这个元素是一个表示 JSON 对象的字符串。
> select * from unnest('{"a":1}') u;
+----------------+------+------+------+-------+-------+----------+
| col | seq | key | path | index | value | this |
+----------------+------+------+------+-------+-------+----------+
| UNNEST_DEFAULT | 0 | a | $.a | NULL | 1 | {"a": 1} |
+----------------+------+------+------+-------+-------+----------+
1 row in set (0.00 sec)
-- 对一个包含整数的字符串数组 '[1,2,3]' 进行展开,并使用别名 u 代表展开后的列。
> select * from unnest('[1,2,3]') u;
+----------------+------+------+------+-------+-------+-----------+
| col | seq | key | path | index | value | this |
+----------------+------+------+------+-------+-------+-----------+
| UNNEST_DEFAULT | 0 | NULL | $[0] | 0 | 1 | [1, 2, 3] |
| UNNEST_DEFAULT | 0 | NULL | $[1] | 1 | 2 | [1, 2, 3] |
| UNNEST_DEFAULT | 0 | NULL | $[2] | 2 | 3 | [1, 2, 3] |
+----------------+------+------+------+-------+-------+-----------+
3 rows in set (0.00 sec)
-- 对一个包含整数的字符串数组 '[1,2,3]' 进行展开,并选择数组的第一个元素作为结果集的一部分返回。'$[0]' 是一个指定要选择的数组元素的路径表达式,true 是一个指示是否返回路径的布尔值,并使用别名 u 代表展开后的列。
> select * from unnest('[1,2,3]','$[0]',true) u;
+----------------+------+------+------+-------+-------+------+
| col | seq | key | path | index | value | this |
+----------------+------+------+------+-------+-------+------+
| UNNEST_DEFAULT | 0 | NULL | $[0] | NULL | NULL | 1 |
+----------------+------+------+------+-------+-------+------+
1 row in set (0.00 sec)
- 示例 2:
create table t1 (a json,b int);
insert into t1 values ('{"a":1,"b":[{"c":2,"d":3},false,4],"e":{"f":true,"g":[null,true,1.1]}}',1);
insert into t1 values ('[1,true,false,null,"aaa",1.1,{"t":false}]',2);
> select * from t1;
+---------------------------------------------------------------------------------------+------+
| a | b |
+---------------------------------------------------------------------------------------+------+
| {"a": 1, "b": [{"c": 2, "d": 3}, false, 4], "e": {"f": true, "g": [null, true, 1.1]}} | 1 |
| [1, true, false, null, "aaa", 1.1, {"t": false}] | 2 |
+---------------------------------------------------------------------------------------+------+
2 rows in set (0.00 sec)
-- 从表 t1 中展开数组 t1.a 的元素,并选择展开后的元素作为结果集的一部分返回。"$a" 是一个指定要选择的数组元素的路径表达式;true 是一个指示是否返回路径的布尔值;使用 f.* 表示选择展开后的所有列;f 是 UNNEST 函数的别名,代表展开后的结果
mysql> select f.* from t1,unnest(t1.a, "$.a", true) as f;
+------+------+------+------+-------+-------+------+
| col | seq | key | path | index | value | this |
+------+------+------+------+-------+-------+------+
| t1.a | 0 | NULL | $.a | NULL | NULL | 1 |
| t1.a | 0 | NULL | $.a | NULL | NULL | 1 |
+------+------+------+------+-------+-------+------+
2 rows in set (0.00 sec)