代码之家  ›  专栏  ›  技术社区  ›  SABER - FICTIONAL CHARACTER

是否根据其名称删除多个列?

  •  1
  • SABER - FICTIONAL CHARACTER  · 技术社区  · 6 年前

    我正在PostgreSQL中创建一个过程/函数。我有一个数组,其中包含一些列名和一个临时表,如下所示;

    columns_names varchar[] := array['A','B','C','D'];
    table PQR(A integer, B integer, C integer, X integer, Y integer);
    

    我要删除列X和Y(即不存在给定数组的列)。

    有没有办法在单行语句中实现这一点?

    有点像

    alter table pqr drop column where columnName not in column_names
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Łukasz Kamiński    6 年前

    如果您正在使用如您所述的函数,并且语言设置为 plpgsql ,则可以使用动态SQL。

    例如:

    EXECUTE concat('ALTER TABLE ',
                   attrelid::regclass::text, ' ',
                   string_agg(concat('DROP COLUMN ', attname), ', ')
                  )
       FROM pg_attribute
      WHERE attnum > 0
        AND NOT attisdropped
        AND attrelid = 'PQR'::regclass
        AND attname != ALL(array['A','B','C','D'])
      GROUP BY attrelid;
    

    它只对一个表有效,否则将抱怨返回多行。 如果需要更多的表,那么可以使用循环和 execute 在里面查询。