如何替换整个数据库中的字符串(数据值)?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何替换整个数据库中的字符串(数据值)?相关的知识,希望对你有一定的参考价值。
我想替换所有表中的子字符串,说我想在postgres中将“Center”替换为“Center”。有没有办法做到这一点?我找到了一个similar问题来替换特定列中的子串。
F.Y.I. :我正在使用“pgAdmin III”。我无法通过解决类似问题来解决我的问题。我不知道任何表和任何列名。所以我想替换整个数据库和所有列中的值。
答案
使用此选择查询可以获取所有表及其列(数据类型为文本或字符的列因您要更新文本字段而有所不同)
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;
$$;
另一答案
对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上完美运行。
以上是关于如何替换整个数据库中的字符串(数据值)?的主要内容,如果未能解决你的问题,请参考以下文章