Создать пример таблицы:
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 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;
Это запускает 3 различных подзапроса в foo
, по одному для каждого столбца, который мы хотим отменить, и возвращает в одной таблице каждую запись из каждого из подзапросов.
Но это отсканирует таблицу N раз, где N - количество столбцов, которые вы хотите отключить. Это неэффективно и является большой проблемой, когда, например, вы работаете с очень большой таблицей, сканирование которой занимает много времени.
Вместо этого используйте:
SELECT id,
unnest(array['a', 'b', 'c']) AS colname,
unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;
Это легче написать, и он будет сканировать таблицу только один раз.
array[a, b, c]
возвращает объект массива со значениями a, b и c в качестве его элементов.
unnest(array[a, b, c])
разбивает результаты в одну строку для каждого из элементов массива.
Надеюсь, это поможет!