【问题标题】:What is the best way to replace a string with another string on entire table?用整个表上的另一个字符串替换一个字符串的最佳方法是什么?
【发布时间】:2015-01-11 11:48:25
【问题描述】:

我的问题与下面类似,但我想将它替换为任何列:

postgresql - replace all instances of a string within text field

例如 - 将整个表(所有行)中的所有 cat 实例替换为 dog

我希望下面的查询适用于所有列(未在更新查询中指定列名)。

UPDATE table_name SET information_schema.columns replace (information_schema.columns, 'old_value', 'new_value');

这实际上似乎不起作用。

有什么建议吗??

【问题讨论】:

  • 您是否真的想自己更改列名?像一个改变表查询?还是只是行的内容?
  • 我不想更改列名。只想替换行的内容。

标签: postgresql replace postgresql-9.1 postgresql-9.2


【解决方案1】:
create table sample (s varchar,s1 varchar,s2 varchar,s3 varchar,s4 varchar);

insert into sample values ('A','A','A','A','A');
insert into sample values('AB','AB','A','AB','AB');
insert into sample values('A','AB','A','AB','A');
insert into sample values('CA','A','A','CA','CA');

select * from sample 

然后像这样尝试

create or replace function f1(_table text,_oldVal text,_newVal text) returns void as 
$$
declare 
rw record;
begin
for rw in 
    select 'UPDATE '||$1||' SET '||C.COLUMN_NAME||' = REPLACE ('||C.COLUMN_NAME||','''||$2||''','''||$3||'''); ' QRY
    FROM (select column_name from information_schema.columns where table_schema='public' and table_name =$1)c
loop
    EXECUTE rw.QRY;
end loop;
end;
$$language plpgsql

然后打电话

select f1('sample','A','Z')

select * from sample 

do 
$$
declare 
rw record;
begin
for rw in 
    select 'UPDATE sample SET '||C.COLUMN_NAME||' = REPLACE ('||C.COLUMN_NAME||',''Z'',''A''); ' QRY
    FROM (select column_name from information_schema.columns where table_schema='public' and table_name ='sample')c
loop
    EXECUTE rw.QRY;
end loop;
end;
$$;

select * from sample 

【讨论】:

  • 完美!!这就是我一直在寻找的。谢谢varchar。我现在可以扩展它以从另一个表中选择 old-val、new-val 对(比如 sample_1,它有这两列并且每个值都是唯一的)。最终目标是通过从 sample_1 表中选择新值来替换表“sample”中的所有旧值。我正在考虑将所有旧新值映射对作为 hstore,然后在“更新”查询中适当地循环它。这样可以吗?还是您有更好的建议?
【解决方案2】:

您将不得不编写一些代码。您需要检索所有表的名称和所有文本名称:

select distinct table_name, column_name from information_schema.columns
    where table_schema='public'
and (data_type like 'char%' or data_type='text')
order by table_name, column_name;

然后为每个表/列组合,构建一个查询以进行替换:

myQuery = "update " + table_name +
    " set " + column_name + " = replace(" + column_name +
    ", 'old_val', 'new_val')"

... 然后以您使用的任何语言执行查询。你可以在 plpgsql 中写这个,但说真的,不要。这是一段非常危险的代码。

如果您正在考虑为 Wordpress 或 Drupal 网站执行此操作,请访问以下人员:https://interconnectit.com/products/search-and-replace-for-wordpress-databases/

【讨论】:

  • 糟糕,我认为它是指所有表,而不仅仅是一张表。如果需要,您可以更改上面的第一个查询以包含“where table_name='mytable'”。
【解决方案3】:

UPDATE 不能这样工作。您需要使用column = value 表达式指定要更改的每一列,用逗号分隔。

UPDATE foo
SET bar = 1, baz = 2
WHERE bar = 5;

这里是关于UPDATE 的更多信息,包括语法。

【讨论】:

  • 是的,这可能是更新中指定列名的限制。我想知道专家的意见,好像有什么棘手的方法可以在不指定列名的情况下实现它,这将使我的任务更容易。
  • 您可以动态生成 SQL,正如其他两个答案所暗示的那样,但我不确定我是否得到了您正在寻找的用例。您想将表中的 所有 列设置为完全相同的值吗?
猜你喜欢
  • 2013-12-03
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多