19

给定一个这样定义的表:

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()函数的解决方案会是什么样子,但一直都是空的。

即使在除了要扩展的数组之外还有大量列且没有主键的情况下,理想的解决方案也很容易使用。处理具有多个数组的情况并不重要。

4

2 回答 2

25

我们可以像 Raphaël 建议的那样将 set-returning 函数unnest()放入SELECT列表中。这曾经在 Postgres 10 之前表现出极端情况问题。请参阅:

从 Postgres 9.3 开始,我们也可以LATERAL为此使用连接。这是将集合返回函数放入FROM列表而不是列表的更简洁、符合标准的方法SELECT

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

一个细微的区别:这会values从结果中删除带有空 / NULL 的行,因为不unnest()返回任何行,而相同的行会在列表中转换为 NULL 值FROM并无论如何返回。100% 等效查询是:

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

看:

于 2015-08-14T02:45:25.000 回答
11

好吧,你提供数据,文档,所以......让我们混合它;)

select 
 name, 
 unnest(values) as value 
from test_values

SqlFiddle

于 2015-08-13T20:22:35.853 回答