给定这样定义的表:
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()函数的解决方案是什么样的,但是一直空无一人。
unnest()
理想的解决方案即使在扩展数组而不是主键且没有大量列的情况下,也易于使用。处理具有多个数组的案例并不重要。
您可以像Rapha毛l建议的那样将返回集合的函数unnest()放入SELECT列表中。但是在Postgres9.3或更高版本中,请为此使用联接。这是将集合返回函数放入列表而不是列表的更干净,更可取的,符合标准的方法LATERALFROM``SELECT
SELECT
LATERAL
FROM``SELECT
SELECT name, value FROM tbl, unnest(values) value; -- implicit CROSS JOIN LATERAL
一个微妙的区别:values由于 没有unnest()返回 row ,因此从结果中删除具有空/ NULL的 行 ,而在FROM列表中将相同的 行 转换为NULL值并始终返回。100%等效查询为:
values
FROM
SELECT t.name, v.value FROM tbl t LEFT JOIN unnest(t.values) v(value) ON true;