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)
下一篇:
深入分析Mysql中limit的用法