PostgreSQL - 替换文本字段中的所有字符串实例

290

在PostgreSQL中,我如何替换数据库列中所有字符串实例?

例如,我想将所有的cat替换为dog

那么,最好的方法是什么?


8
如果谷歌搜索失败,请尝试阅读手册:http://www.postgresql.org/docs/current/static/functions-string.html。 - user330315
我认为最好的解决方案在这里:https://dev59.com/mHRA5IYBdhLWcg3wxA1N#836090 - Biskrem Muhammad
4个回答

527
你想使用postgresql的replace函数:replace。
replace(string text, from text, to text)

例如:

UPDATE <table> SET <field> = replace(<field>, 'cat', 'dog')

请注意,这将是一种字符串替换,因此“category”将变为“dogegory”。使用regexp_replace函数可以帮助您定义一个更严格的匹配模式来替换所需内容。


5
大家好,我喜欢你们的答案和解释,非常有帮助。能否请你们添加一个使用regexp_replace的例子呢?谢谢! - Wim Feijen
2
为了更好地细化,您可以使用regexp_replace函数。 - drs
对我没用: psql -d bercut -c 'UPDATE tasks_list SET link_to_report = replace(link_to_report ,"ftp://1.2.3.4/", "http://1.2.3.4/reports/")' 错误:列“ftp://1.2.3.4/”不存在 第1行:..._list SET link_to_report = replace(link_to_report,"ftp://1.2... ^ - Евгений Артеменко
1
@ЕвгенийАртеменко 这可能是因为您使用了双引号而不是引号。Postgres 对此非常挑剔。您需要单引号(即'1.2.3.4'是一个字符串,"1.2.3.4"是一个_安全的_列名,一个可能是保留关键字的名称)。 - Alexis Wilke

109

正则表达式方式

如果你需要更严格的替换匹配,PostgreSQL 的 regexp_replace 函数可以使用 POSIX 正则表达式模式进行匹配。它的语法为 regexp_replace(source, pattern, replacement [, flags ])

我将使用标志ig用于不区分大小写和全局匹配。 我还将使用\m\M分别匹配单词的开头和结尾。

通常在执行正则表达式替换时会遇到一些棘手的问题。让我们看看如何轻松地将cat替换为dog

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog');
-->                    Cat bobdog cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'i');
-->                    dog bobcat cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'g');
-->                    Cat bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'gi');
-->                    dog bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat', 'dog', 'gi');
-->                    dog bobcat dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat\M', 'dog', 'gi');
-->                    dog bobdog dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat\M', 'dog', 'gi');
-->                    dog bobcat dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat(s?)\M', 'dog\1', 'gi');
-->                    dog bobcat dog dogs catfish

即使经过所有这些,仍然存在至少一个未解决的条件。例如,以“Cat”开头的句子将被替换为小写的“dog”,从而破坏了句子的大写。

查看当前PostgreSQL模式匹配文档以获取详细信息。

使用替换文本更新整个列

根据我的例子,也许最安全的选择是:

UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');

1
约束符号 ^$ 匹配字符串的开头和结尾;但是 \m\M 仅匹配单词的开头和结尾。因此,在大多数情况下使用 ^$ 将失败。 - Clint Pachl

36

你可以使用replace函数。

UPDATE your_table SET field = REPLACE(your_field, 'cat','dog')

以下是函数定义(来自这里):

replace(string text, from text, to text)

并返回修改后的文本。您还可以查看此 SQL Fiddle


0

以下是一个编程示例,使用正则表达式将列中的所有1个或多个空格字符替换为下划线 -

select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;

我认为只需要在"s"之前加一个反斜杠 - Marty Neal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接