postgresql - замінити всі екземпляри рядка в текстовому полі


213

Як у postgresql замінити всі екземпляри рядка в стовпці бази даних?

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

Який найкращий спосіб зробити це?


7
Якщо googling не вдається, спробуйте посібник: postgresql.org/docs/current/static/functions-string.html
a_horse_with_no_name

Відповіді:


404

Ви хочете використовувати функцію заміни postgresql :

replace(string text, from text, to text)

наприклад :

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

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


4
Привіт, хлопці, мені подобається ваша відповідь та пояснення, це дуже корисно. Не могли б ви додати приклад за допомогою regexp_replace? Дякую!
Вім Фейєн

1
для кращого зернистості ви можете скористатисяregexp_replace
дор

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

Навіть після цього існує хоча б одна невирішена умова. Наприклад, речення, що починаються з "Кішка", будуть замінені на малі "собаки", які порушують велику літери речення.

Ознайомтеся з поточними документами, що відповідають шаблону 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.