postgresql - заменить все вхождения строки в текстовом поле


213

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

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

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


7
Если поиск в Google не
помог

Ответы:


404

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

replace(string text, from text, to text)

например :

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

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


4
Привет, ребята, мне нравится ваш ответ и объяснение, это действительно полезно. Не могли бы вы добавить пример, используя regexp_replace? Спасибо!
Вим Фейен

1
для лучшей детализации, вы можете использоватьregexp_replace
DRS

83

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

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

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

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

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');

30

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

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

Определение функции следующее (получено отсюда ):

replace(string text, from text, to text)

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


0

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

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

Я думаю, что требуется только одна обратная косая черта перед буквой "s"
Марти Нил
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.