根据名称删除多列?

时间:2018-08-03 08:02:36

标签: postgresql plpgsql

我正在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 个答案:

答案 0 :(得分:3)

如果使用的功能与您提到的功能相同,并且语言设置为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;

它仅适用于一张表,否则将抱怨返回多个行。 如果需要更多表,则可以在其中使用LOOP和execute查询。

相关问题