postgresql-заменить все экземпляры строки в текстовом поле

в postgresql, как заменить все экземпляры строки в столбце базы данных?

скажем, я хочу заменить все экземпляры cat с dog, например.

каков наилучший способ сделать это?

4 ответов


вы хотите использовать заменить функция:

replace(string text, from text, to text)

например :

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

имейте в виду, что это будет замена строки на строку, поэтому "категория" станет "догегорией". функция regexp_replace может помочь вам определить более строгий шаблон соответствия для того, что вы хотите заменить.


Путь Регулярного Выражения

Если вам нужно более строгое соответствие замены, PostgreSQL regexp_replace функция может соответствовать с помощью шаблонов регулярных выражений POSIX. Он имеет синтаксис regexp_replace(источник, шаблон, замена [, флаги ]).

Я буду использовать флаги i и g для нечувствительного к регистру и глобального сопоставления, соответственно. Я также буду использовать \m и \M чтобы соответствовать началу и концу слова, соответственно.

обычно довольно много gotchas при выполнении замены регулярного выражения. Давайте посмотрим, как легко заменить a кошки С собака.

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', 'gi');
-->                    dog bobcat dog dogs catfish

даже после всего этого, есть по крайней мере одно неразрешенное условие. Например, предложения, начинающиеся с "Cat", будут заменены строчными буквами" dog", которые нарушают капитализацию предложения.

проверьте текущий PostgreSQL шаблон соответствие docs для всех деталей.

обновить весь столбец с текстом замены

учитывая мои примеры, возможно, самым безопасным вариантом было бы:

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

можно использовать replace функции

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

определение функции выглядит следующим образом (получил от здесь):

replace(string text, from text, to text)

и возвращает измененный текст. Вы также можете проверить эта скрипка sql.


вот пример, который заменяет все экземпляры 1 или более символов пробела в столбце подчеркиванием с использованием регулярного выражения -

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