我正在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
答案 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
查询。