创建一个示例表:
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])将每个数组元素的结果分成一行。
希望有帮助!