如何替换整个数据库中的字符串(数据值)?

时间:2014-12-01 06:16:09

标签: database postgresql replace dynamic-sql

我想替换所有表中的子字符串,说我想在postgres中将“Center”替换为“Center”。有没有办法做到这一点?我找到了一个similar问题来替换特定列中的子字符串。

F.Y.I。 :我正在使用“pgAdmin III”。 我无法通过解决类似问题来解决我的问题。我不知道任何表和任何列名。所以我想替换整个数据库和所有列中的值。

2 个答案:

答案 0 :(得分:1)

使用此选择查询获取所有表及其列(数据类型为文本或字符的列因您要更新文本字段而有所不同)

SELECT column_name,table_name 
FROM   information_schema.columns 
WHERE  table_schema='public' 
AND    (data_type ='text' OR data_type ='character varying') 
AND    table_name in (SELECT table_name 
                      FROM   information_schema.tables 
                      WHERE  table_schema='public' AND table_type ='BASE TABLE')

根据您的条件

将其包装在动态SQL中以进行更新
DO
$$
DECLARE 
rw record;
BEGIN
FOR rw IN 
    SELECT 'UPDATE '||C.table_name||'  SET '||C.column_name||' = REPLACE ('||C.COLUMN_NAME||',''Center'',''Centre''); ' QRY
    FROM (SELECT column_name,table_name 
          FROM   information_schema.columns 
          WHERE  table_schema='public' 
          AND    (data_type ='text' OR data_type ='character varying')
          AND    table_name in (SELECT table_name 
                                FROM   information_schema.tables 
                                WHERE  table_schema='public' 
                                AND    table_type ='BASE TABLE'))c

LOOP
    EXECUTE rw.QRY;
END LOOP;
END;
$$;

答案 1 :(得分:0)

对wingedpanther代码进行一点修改:

DO
$$
DECLARE 
rw record;
BEGIN
FOR rw IN 
    SELECT 'UPDATE "'||C.table_name||'"  SET "'||C.column_name||'" = REPLACE ("'||C.COLUMN_NAME||'",''Center'',''Centre''); ' QRY
    FROM (SELECT column_name,table_name 
          FROM   information_schema.columns 
          WHERE  table_schema='public' 
          AND    (data_type ='text' OR data_type ='character varying')
          AND    table_name in (SELECT table_name 
                                FROM   information_schema.tables 
                                WHERE  table_schema='public' 
                                AND    table_type ='BASE TABLE'))c

LOOP
    EXECUTE rw.QRY;
END LOOP;
END;
$$;

我添加了一些双引号,以便在表名包含下划线符号时仍然可以使用它。 在PG 9.5.11-0ubuntu0.16.04上完美运行。