unpivot和PostgreSQL

PostgreSQL中有一个不可更改的等效函数吗?



繁星coding
浏览 899回答 3
3回答

森林海

创建一个示例表: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])将数组的每个元素的结果分成一行。希望有帮助!
打开App,查看更多内容
随时随地看视频慕课网APP