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

圧縮されたPostgreSQL行を個別の列に展開するにはどうすればよいですか?

    9.3以降:横方向のクエリ

    PostgreSQL 9.3以降では、暗黙的なラテラルクエリを使用します。

    SELECT f.* FROM things t, some_function(t.thing_id) f;
    

    すべての新しいクエリにはこの定式化をお勧めします 。上記は標準的な定式化です 。

    また、RETURNS TABLEの関数でも正しく機能します。 またはRETURNS SETOF RECORD また、RETURNS RECORDのout-paramsを使用した関数もあります。 。

    略記:

    SELECT f.*
    FROM things t
    CROSS JOIN LATERAL some_function(t.thing_id) f;
    

    9.3より前:ワイルドカード拡張(注意して)

    以前のバージョンでは、some_functionの複数の評価が発生します 、しない some_functionの場合に機能します セットを返します。これは使用しないでください

    SELECT (some_function(thing_id)).* FROM things;
    

    以前のバージョンでは、some_functionの複数の評価を回避しています 間接参照の第2層を使用します。かなり古いバージョンのPostgreSQLをサポートする必要がある場合にのみこれを使用してください。

    SELECT (f).*
    FROM (
      SELECT some_function(thing_id) f
      FROM things
    ) sub(f);
    

    デモ:

    セットアップ:

    CREATE FUNCTION some_function(i IN integer, x OUT integer, y OUT text, z OUT text) RETURNS record LANGUAGE plpgsql AS $$
    BEGIN
      RAISE NOTICE 'evaluated with %',i;
      x := i;
      y := i::text;
      z := 'dummy';
      RETURN;
    END;
    $$;
    
    create table things(thing_id integer);
    insert into things(thing_id) values (1),(2),(3);
    

    テスト実行:

    demo=>     SELECT f.* FROM things t, some_function(t.thing_id) f;
    NOTICE:  evaluated with 1
    NOTICE:  evaluated with 2
    NOTICE:  evaluated with 3
     x | y |   z   
    ---+---+-------
     1 | 1 | dummy
     2 | 2 | dummy
     3 | 3 | dummy
    (3 rows)
    
    demo=>     SELECT (some_function(thing_id)).* FROM things;
    NOTICE:  evaluated with 1
    NOTICE:  evaluated with 1
    NOTICE:  evaluated with 1
    NOTICE:  evaluated with 2
    NOTICE:  evaluated with 2
    NOTICE:  evaluated with 2
    NOTICE:  evaluated with 3
    NOTICE:  evaluated with 3
    NOTICE:  evaluated with 3
     x | y |   z   
    ---+---+-------
     1 | 1 | dummy
     2 | 2 | dummy
     3 | 3 | dummy
    (3 rows)
    
    demo=>  SELECT (f).*
        FROM (
          SELECT some_function(thing_id) f
          FROM things
        ) sub(f);
    NOTICE:  evaluated with 1
    NOTICE:  evaluated with 2
    NOTICE:  evaluated with 3
     x | y |   z   
    ---+---+-------
     1 | 1 | dummy
     2 | 2 | dummy
     3 | 3 | dummy
    (3 rows)
    


    1. ODBCとは何ですか?

    2. コメントの総数を数える方法

    3. JavaFXMySQL接続例をお願いします

    4. ノードjsを使用してjson出力をmysqlに挿入する方法