unpivot和PostgreSQL

前端之家收集整理的这篇文章主要介绍了unpivot和PostgreSQL前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Postgresql中是否有等效功能
创建一个示例表:
CREATE TEMP TABLE foo (id int,a text,b text,c text);
INSERT INTO foo VALUES (1,'ant','cat','chimp'),(2,'grape','mint','basil');

您可以使用UNION ALL“展开”或“uncrosstab”

SELECT id,'a' AS colname,a AS thing
FROM foo
UNION ALL
SELECT id,'b' AS colname,b AS thing
FROM foo
UNION ALL
SELECT id,'c' AS colname,c AS thing
FROM foo
ORDER BY id;

这可以在foo上运行3个不同的子查询,一个对于我们要解除汇总的每一列,并在一个表中返回每个子查询的每个记录。

但是这将扫描表N次,其中N是要解除的列数。这是无效率的,当一个很大的问题需要很长时间来扫描时,这个问题很大。

而是使用:

SELECT id,unnest(array['a','b','c']) AS colname,unnest(array[a,b,c]) AS thing
FROM foo
ORDER BY id;

这更容易编写,只会扫描一次表。

数组[a,b,c]返回数组对象,值为a,b和c作为元素。
unnest(array [a,b,c])将每个数组元素的结果分成一行。

希望有帮助!

猜你在找的Postgre SQL相关文章