在postgres中,如何删除共享相同前缀的所有列

时间:2014-12-31 21:23:15

标签: postgresql

我一直在使用以下代码删除所有共享相同前缀的表(在这种情况下,删除名称以'supenh_'开头的所有表):

DO
$do$
DECLARE
   _tbl text;
BEGIN
FOR _tbl  IN
    SELECT quote_ident(table_schema) || '.'
        || quote_ident(table_name)      -- escape identifier and schema-qualify!
    FROM   information_schema.tables
    WHERE  table_name LIKE 'supenh_' || '%'  -- your table name prefix
    AND    table_schema NOT LIKE 'pg_%'     -- exclude system schemas
LOOP
  --  RAISE NOTICE '%',
   EXECUTE
  'DROP TABLE ' || _tbl;
END LOOP;
END
$do$;

有没有办法修改此代码/或使用不同的脚本,以便从一个特定的表中删除所有以相同前缀开头的列(例如,'patient1_')?

1 个答案:

答案 0 :(得分:3)

你可以把它写成PL / pgSQL函数:

CREATE OR REPLACE FUNCTION drop_columns_with_prefix(tbl_name TEXT, column_prefix TEXT)  RETURNS VOID AS
$BODY$
DECLARE
    _column TEXT;
BEGIN
    FOR _column  IN
        SELECT quote_ident(column_name)
        FROM   information_schema.columns
        WHERE  table_name = tbl_name
        AND    column_name LIKE column_prefix || '%'
        AND    table_schema NOT LIKE 'pg_%'
    LOOP
      --  RAISE NOTICE '%',
       EXECUTE
      'ALTER TABLE ' || tbl_name || ' DROP COLUMN ' || _column;
    END LOOP;
END
$BODY$
LANGUAGE plpgsql VOLATILE;

使用以下方式调用:

SELECT drop_columns_with_prefix('tbl_name', 'prefix_');

或者,如果您不想将其用作功能:

DO
$do$
DECLARE
    _column TEXT;
BEGIN
FOR _column  IN
    SELECT quote_ident(column_name)
    FROM   information_schema.columns
    WHERE  table_name = 'tbl_name'
    AND    column_name LIKE 'prefix_%'
    AND    table_schema NOT LIKE 'pg_%'
LOOP
  --  RAISE NOTICE '%',
   EXECUTE
  'ALTER TABLE tbl_name DROP COLUMN ' || _column;
END LOOP;
END
$do$