postgresql中unnest使用说明与示例
函数说明
语法:unnest(anyarray)
返回值:setof anyelement(可以理解为一个(临时)表)
说明:unnest函数将输入的数组转换成一个表,这个表的每一列都代表相应的一个数组中的元素。
如果unnest与其他字段一起出现在select中,就相当于其他字段进行了一次join。
###执行计划不出现gather motion N:1就可以,其他都是不可避免的
使用场景
完成行转列的场景
示例一: 单个unnest
select unnest(Array[1,2,3]) as a;
a
---
1
2
3
(3 rows)
示例二: unnest与其他字段一起查询(常用场景)
select '张三' as name, unnest(Array['语文','数学','英语']) as course;
name | course
------+--------
张三 | 语文
张三 | 数学
张三 | 英语
(3 rows)
示例三: 多个unnest与其他字段一起查询
多个unnest一起使用时要注意:
如果2个unnest返回的表行数相同,则是根据行号进行join的,就是输出结果行1对应行1,行2对应行2…
select '张三' as name, unnest(Array['语文','数学','英语']) as course, unnest(Array[90,85,80]) as score;
name | course | score
------+--------+-------
张三 | 语文 | 90
张三 | 数学 | 85
张三 | 英语 | 80
(3 rows)
如果2个unnest返回的表行数不同,则返回的结果是笛卡尔join,返回的总行数=表1行数 * 表2行数
select '张三' as name, unnest(Array['语文','数学','英语']) as course, unnest(Array['篮球','足球']) as interest;
name | course | interest
------+--------+----------
张三 | 语文 | 篮球
张三 | 数学 | 足球
张三 | 英语 | 篮球
张三 | 语文 | 足球
张三 | 数学 | 篮球
张三 | 英语 | 足球
(6 rows)