サンプルテーブルを作成します:
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を使用して「unpivot」または「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つの異なるサブクエリを実行します 、ピボットを解除する列ごとに1つ、各サブクエリのすべてのレコードを1つのテーブルに返します。
ただし、これによりテーブルがN回スキャンされます。ここで、Nはピボット解除する列の数です。これは非効率的であり、たとえば、スキャンに時間がかかる非常に大きなテーブルで作業している場合は大きな問題になります。
代わりに、以下を使用してください:
SELECT id,
unnest(array['a', 'b', 'c']) AS colname,
unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;
これは記述が簡単で、テーブルを1回だけスキャンします。
array[a, b, c]
a、b、cの値を要素として持つ配列オブジェクトを返します。unnest(array[a, b, c])
配列の要素ごとに結果を1つの行に分割します。
お役に立てば幸いです。