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

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

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

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

Ответ 1

Вы хотите использовать функцию postgresql replace:

replace(string text, from text, to text)

например:

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

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

Ответ 2

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

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

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

Обычно при запуске regex replacment обычно происходит довольно много ошибок. Посмотрим, как легко заменить кошку собакой.

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", будут заменены нижним регистром "собака", которые сломают капитализацию предложения.

Просмотрите текущий файл PostgreSQL соответствующий документам для всех деталей.

Обновить весь столбец с заменяющим текстом

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

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

Ответ 3

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

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

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

replace(string text, from text, to text)

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

Ответ 4

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

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