正则表达式方式
如果您需要更严格的替换匹配,PostgreSQL 的regexp_replace 函数可以使用 POSIX 正则表达式模式进行匹配。它的语法是 regexp_replace(source, pattern, replacement [, flags ])。
我将分别使用标志i 和g 进行不区分大小写和全局匹配。我还将使用\m 和\M 分别匹配单词的开头和结尾。
在执行正则表达式替换时通常会遇到很多问题。让我们看看用 dog 替换 cat 是多么容易。
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 pattern matching 文档了解所有详细信息。
用替换文本更新整个列
鉴于我的例子,也许最安全的选择是:
UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');