小编典典

PostgreSQL:将与数组的关系展平,以使每个数组条目发出一行

sql

给定这样定义的表:

CREATE TABLE test_values(name TEXT, values INTEGER[]);

…以及以下值:

| name  | values  |
+-------+---------+
| hello | {1,2,3} |
| world | {4,5,6} |

我试图找到一个查询,该查询将返回:

| name  | value |
+-------+-------+
| hello | 1     |
| hello | 2     |
| hello | 3     |
| world | 4     |
| world | 5     |
| world | 6     |

我已经阅读了有关访问数组的上游文档,并试图考虑使用unnest()函数的解决方案是什么样的,但是一直空无一人。

理想的解决方案即使在扩展数组而不是主键且没有大量列的情况下,也易于使用。处理具有多个数组的案例并不重要。


阅读 225

收藏
2021-04-22

共1个答案

小编典典

您可以像Rapha毛l建议的那样将返回集合的函数unnest()放入SELECT列表中。但是在Postgres9.3或更高版本中,请为此使用联接。这是将集合返回函数放入列表而不是列表的更干净,更可取的,符合标准的方法LATERALFROM``SELECT

SELECT name, value
FROM   tbl, unnest(values) value;  -- implicit CROSS JOIN LATERAL

一个微妙的区别:values由于 没有unnest()返回 row ,因此从结果中删除具有空/ NULL的
,而在FROM列表中将相同的 转换为NULL值并始终返回。100%等效查询为:

SELECT t.name, v.value
FROM   tbl t
LEFT   JOIN unnest(t.values) v(value) ON true;
2021-04-22