PostgreSQL,带查询的删除表

Win*_*Too 1 postgresql

我有这样的查询列出当前数据库中的表:

SELECT c.relname 
FROM pg_catalog.pg_class c 
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
WHERE c.relkind 
IN ('r','') AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND
pg_catalog.pg_table_is_visible(c.oid)
Run Code Online (Sandbox Code Playgroud)

我试图使用上部SELECT像子查询删除所有这些表:

DROP TABLE IF EXISTS (SELECT c.relname 
FROM pg_catalog.pg_class c 
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
WHERE c.relkind 
IN ('r','') AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND
pg_catalog.pg_table_is_visible(c.oid)) as tname 
Run Code Online (Sandbox Code Playgroud)

但那不起作用.
如何编写一个查询将删除显示SELECT查询列出的所有表?
现在我使用DataReader循环查询结果并将表删除一个.
但我认为这可能会"立刻"发生.

a_h*_*ame 5

你需要使用动态SQL,而这只能用于像PL/pgSQL这样的过程语言,如下所示:

do
$$
declare
   stmt text;
   table_rec record;
begin
   for table_rec in (SELECT c.relname as tname
                     FROM pg_catalog.pg_class c 
                       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
                     WHERE c.relkind IN ('r','') 
                       AND n.nspname NOT IN ('pg_catalog', 'pg_toast') 
                       AND pg_catalog.pg_table_is_visible(c.oid))
   loop
     execute 'drop table '||table_rec.tname||' cascade';
   end loop;
end;
$$
Run Code Online (Sandbox Code Playgroud)