森林海
创建一个示例表: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来“取消透视”或“取消交叉表”:SELECT id, 'a' AS colname, a AS thingFROM fooUNION ALLSELECT id, 'b' AS colname, b AS thingFROM fooUNION ALLSELECT id, 'c' AS colname, c AS thingFROM fooORDER BY id;这会在上运行3个不同的子查询foo,每个要取消透视的列一个,然后在一个表中返回每个子查询中的每个记录。但这将扫描表N次,其中N是您要取消透视的列数。这效率低下,而且是一个很大的问题,例如,当您使用非常大的表进行扫描时,这需要很长时间。而是使用:SELECT id, unnest(array['a', 'b', 'c']) AS colname, unnest(array[a, b, c]) AS thingFROM fooORDER BY id;这更容易编写,并且只会扫描表一次。array[a, b, c]返回一个数组对象,其值分别为a,b和c。 unnest(array[a, b, c])将数组的每个元素的结果分成一行。希望有帮助!