代码之家  ›  专栏  ›  技术社区  ›  Zanko

选择仅为主键或外键的列

  •  0
  • Zanko  · 技术社区  · 6 年前

    假设我有下表

    CREATE TABLE my_table (
        a  TEXT NULL,
        id TEXT PRIMARY KEY NOT NULL,
        c  TEXT NULL,
        d  TEXT REFERENCES other_table_1(id) NOT NULL,
        e  TEXT REFERENCES other_table_2(id) NOT NULL
    );
    

    我想执行一个select语句,只选择重要的列,即主键和外键。

     SELECT (...?) FROM my_table 
    

    仅预期输出列 id, d, e

    我能做到这一点的最佳非黑客方式是什么?

    0 回复  |  直到 6 年前
        1
  •  0
  •   Hyruma92    6 年前

    您可以创建一个函数,为您构建sql语句,然后执行结果。

    CREATE OR REPLACE FUNCTION build_select(_tbl regclass)
      RETURNS text AS
    $func$
        SELECT format('SELECT %s FROM %s'
                     , string_agg(quote_ident(important_column), ', ')
                     , $1)
    FROM (SELECT a.attname as important_column
    FROM   pg_index i
    JOIN   pg_attribute a ON a.attrelid = i.indrelid
                         AND a.attnum = ANY(i.indkey)
    WHERE  i.indrelid = $1
    AND    i.indisprimary
    UNION
    SELECT  ta.attname AS important_column
      FROM (
       SELECT conname, conrelid, confrelid,
              unnest(conkey) AS conkey, unnest(confkey) AS confkey
         FROM pg_constraint
         WHERE conrelid = $1
      ) sub
      JOIN pg_attribute AS ta ON ta.attrelid = conrelid AND ta.attnum = conkey
      JOIN pg_attribute AS fa ON fa.attrelid = confrelid AND fa.attnum = confkey) my_sub_query
    $func$ LANGUAGE sql;
    

    使用此功能,如果您这样做:

    SELECT build_select('my-schema.my-table')
    

    将返回您:

    SELECT id, d, e FROM my-schema.my-table
    

    你可以执行这个