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

PL / Python&postgreSQL:多くの列のテーブルを返すための最良の方法は何ですか?

    これを試してください:

    CREATE OR REPLACE FUNCTION myFunc02() 
    RETURNS TABLE (like mysales) AS 
    $$
    rv = plpy.execute('SELECT * FROM mysales ORDER BY id;', 5)
    d  = rv.nrows()
    return rv[0:d]
    $$ LANGUAGE 'plpythonu';
    

    返されるもの:

    gpadmin=# SELECT * FROM myFunc02();                             
     id | year | qtr | day |    region
    ----+------+-----+-----+---------------
      1 | 2014 |   1 |   1 | north america
      2 | 2002 |   2 |   2 | europe
      3 | 2014 |   3 |   3 | asia
      4 | 2010 |   4 |   4 | north-america
      5 | 2014 |   1 |   5 | europe
    (5 rows)
    

    GreenplumやHAWQのようなMPPで考慮すべきことは、関数自体でデータを生成するのではなく、引数としてデータを受け取り、結果を返す関数を探すことです。すべてのセグメントで同じコードが実行されるため、意図しない副作用が発生する場合があります。

    SETOFの更新 バリアント:

    CREATE TYPE myType AS (id integer, x integer, y integer, s text);
    
    CREATE OR REPLACE FUNCTION myFunc02a() 
    RETURNS SETOF myType AS 
    $$
    
    # column names of myType ['id', 'x', 'y', 's']
    rv = plpy.execute("SELECT id, year as x, qtr as y, region as s FROM mysales ORDER BY id", 5)
    d  = rv.nrows()
    
    return rv[0:d]
    $$ LANGUAGE 'plpythonu';
    

    元の例と同じデータを使用するには、各列をmyTypeの対応する名前にエイリアスする必要があることに注意してください。 。また、mysalesのすべての列を列挙する必要があります このルートを使用する場合-CREATE TYPE foo LIKE tableBarへの簡単な方法はありません これを使用して、すべての名前/タイプを列挙する手作業の一部を軽減できる場合があります。

    select string_agg(t.attname || ' ' || t.format_type || ', ') as columns  from 
    (
    SELECT a.attname,
      pg_catalog.format_type(a.atttypid, a.atttypmod),
      (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
       FROM pg_catalog.pg_attrdef d
       WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef),
      a.attnotnull, a.attnum,
      a.attstorage ,
      pg_catalog.col_description(a.attrelid, a.attnum)
    FROM pg_catalog.pg_attribute a
    LEFT OUTER JOIN pg_catalog.pg_attribute_encoding e
    ON   e.attrelid = a .attrelid AND e.attnum = a.attnum
    WHERE a.attrelid = (SELECT oid FROM pg_class WHERE relname = 'mysales') AND a.attnum > 0 AND NOT a.attisdropped
    ORDER BY a.attnum
    ) t ;
    

    返されるもの:

                                  columns
    -------------------------------------------------------------------
     id integer, year integer, qtr integer, day integer, region text,
    (1 row)
    



    1. psycopg2を使用してpostgresテーブルにデータをインポートする際の値エラー

    2. テーブルから動的な列のセットを選択し、それぞれの合計を取得します

    3. xampp php 7未定義の関数(mysqlおよびodbc)の呼び出し

    4. MySQLチュートリアル:MySQL IN句(基本)