postgresql - zamień wszystkie wystąpienia ciągu w polu tekstowym

213

Jak w Postgresql mogę zastąpić wszystkie wystąpienia ciągu w kolumnie bazy danych?

Że chcę zastąpić wszystkie wystąpienia catz dog, na przykład.

Jak najlepiej to zrobić?

znak
źródło
7
Jeśli przeglądanie się nie powiedzie, wypróbuj instrukcję: postgresql.org/docs/current/static/functions-string.html
a_horse_with_no_name

Odpowiedzi:

404

Chcesz użyć funkcji zamiany postgresql :

replace(string text, from text, to text)

na przykład :

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

Pamiętaj jednak, że będzie to zamiana strun na struny, więc „kategoria” stanie się „dogegory”. funkcja regexp_replace może pomóc ci zdefiniować bardziej rygorystyczny wzór dopasowania dla tego, co chcesz zastąpić.

Jerome WAGNER
źródło
4
Cześć wszystkim, podoba mi się twoja odpowiedź i wyjaśnienie, to jest naprawdę pomocne. Czy możesz dodać przykład za pomocą regexp_replace? Dzięki!
Wim Feijen
1
dla lepszej ziarnistości można użyćregexp_replace
drs
83

Sposób wyrażania regularnego

Jeśli potrzebujesz ściślejszego dopasowania zamiennego, regexp_replacefunkcja PostgreSQL może się zgadzać przy użyciu wzorców wyrażeń regularnych POSIX. Ma składnię regexp_replace (źródło, wzorzec, zamiana [, flagi]) .

Będę używać flag ii odpowiednio gdo rozróżniania wielkości liter i dopasowania globalnego. Użyję również \mi \Mdopasować odpowiednio początek i koniec słowa.

Podczas wymiany wyrażeń regularnych zwykle występuje sporo błędów. Zobaczmy, jak łatwo jest zamienić kota z psem .

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

Nawet po tym wszystkim istnieje co najmniej jeden nierozwiązany warunek. Na przykład zdania zaczynające się od „Kot” zostaną zastąpione małymi literami „pies”, co łamie wielkie litery zdań.

Sprawdź aktualne dokumenty dopasowujące wzorzec PostgreSQL dla wszystkich szczegółów.

Zaktualizuj całą kolumnę o tekst zastępczy

Biorąc pod uwagę moje przykłady, być może najbezpieczniejszą opcją byłoby:

UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');
Clint Pachl
źródło
30

Możesz użyć tej replacefunkcji

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

Definicja funkcji jest następująca (pochodzi stąd ):

replace(string text, from text, to text)

i zwraca zmodyfikowany tekst. Możesz również sprawdzić to skrzypce sql .

Ciprian Mocanu
źródło
0

Oto przykład, który zastępuje wszystkie wystąpienia 1 lub więcej białych znaków w kolumnie znakiem podkreślenia przy użyciu wyrażenia regularnego -

select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;
użytkownik1797212
źródło
Myślę, że potrzebny jest tylko jeden odwrotny ukośnik przed „s”
Marty Neal