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)
经验分享 程序员 微信小程序 职场和发展