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)
### PostgreSQL `unnest` 函数详解 #### 定义功能 `unnest` 是一种用于数组操作的强大函数,在 PostgreSQL 中被广泛应用于将数组展开成多行记录。该函数可以接受一个或多维数组作为输入参数,并返回一系列单个元素,每一行为一个元素。 ```sql SELECT unnest(array[1, 2, 3]); ``` 上述 SQL 查询会生成三行输出,每行分别对应于给定整数数组中的各个成员[^1]。 #### 处理复杂结构的数据集 当面对更复杂的场景时,比如处理嵌套数组或多个并列的数组列表,`unnest` 同样能胜任。对于这种情况,可以通过指定额外的参数来实现同步解包: ```sql WITH example AS ( SELECT array['a', 'b'] as letters, array[10, 20] as numbers ) SELECT * FROM unnest(letters, numbers) AS t(letter, number); ``` 这段代码展示了如何同时解开两个关联度较高的不同类型的数组集合,最终形成一张包含两列的新表——一列为字母字符,另一列为对应的数值型数据。 #### 实际应用场景举例 假设有一个存储标签及其权重信息的关系表格,其中某些记录可能携带了不止一对 (tag, weight),而是以数组形式存在;此时就可以利用 `unnest` 来简化查询逻辑,使得后续分析更加便捷高效。 ```sql CREATE TABLE tag_weights( id SERIAL PRIMARY KEY, tags TEXT[], weights INTEGER[] ); INSERT INTO tag_weights(tags,weights) VALUES('{red,blue}', '{1,5}'); SELECT id, letter, num FROM tag_weights tw, LATERAL unnest(tw.tags,tw.weights) u(letter,num); ``` 此脚本创建了一个简单的测试环境,并演示了怎样从复合字段中提取有用的信息片段。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值