sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLのunpivot()と同等

    サンプルテーブルを作成します:

    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つの行に分割します。

    お役に立てば幸いです。



    1. MySQLは複数の文字を置き換えることができますか?

    2. MySQLで大文字を小文字に変換する方法

    3. PHPの日付をmysql形式に変換します

    4. OracleにリンクされているSQLServerからSQLクエリを作成するときに、日付リテラルを指定するにはどうすればよいですか?