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)
  9. -- 对一个包含整数的字符串数组 '[1,2,3]' 进行展开,并使用别名 u 代表展开后的列。
  10. > select * from unnest('[1,2,3]') u;
  11. +----------------+------+------+------+-------+-------+-----------+
  12. | col | seq | key | path | index | value | this |
  13. +----------------+------+------+------+-------+-------+-----------+
  14. | UNNEST_DEFAULT | 0 | NULL | $[0] | 0 | 1 | [1, 2, 3] |
  15. | UNNEST_DEFAULT | 0 | NULL | $[1] | 1 | 2 | [1, 2, 3] |
  16. | UNNEST_DEFAULT | 0 | NULL | $[2] | 2 | 3 | [1, 2, 3] |
  17. +----------------+------+------+------+-------+-------+-----------+
  18. 3 rows in set (0.00 sec)
  19. -- 对一个包含整数的字符串数组 '[1,2,3]' 进行展开,并选择数组的第一个元素作为结果集的一部分返回。'$[0]' 是一个指定要选择的数组元素的路径表达式,true 是一个指示是否返回路径的布尔值,并使用别名 u 代表展开后的列。
  20. > select * from unnest('[1,2,3]','$[0]',true) u;
  21. +----------------+------+------+------+-------+-------+------+
  22. | col | seq | key | path | index | value | this |
  23. +----------------+------+------+------+-------+-------+------+
  24. | UNNEST_DEFAULT | 0 | NULL | $[0] | NULL | NULL | 1 |
  25. +----------------+------+------+------+-------+-------+------+
  26. 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)
  12. -- 从表 t1 中展开数组 t1.a 的元素,并选择展开后的元素作为结果集的一部分返回。"$a" 是一个指定要选择的数组元素的路径表达式;true 是一个指示是否返回路径的布尔值;使用 f.* 表示选择展开后的所有列;f UNNEST 函数的别名,代表展开后的结果
  13. mysql> select f.* from t1,unnest(t1.a, "$.a", true) as f;
  14. +------+------+------+------+-------+-------+------+
  15. | col | seq | key | path | index | value | this |
  16. +------+------+------+------+-------+-------+------+
  17. | t1.a | 0 | NULL | $.a | NULL | NULL | 1 |
  18. | t1.a | 0 | NULL | $.a | NULL | NULL | 1 |
  19. +------+------+------+------+-------+-------+------+
  20. 2 rows in set (0.00 sec)