Skip to content

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)