postgresql - Ersetzt alle Instanzen einer Zeichenfolge im Textfeld

213

Wie ersetze ich in postgresql alle Instanzen einer Zeichenfolge in einer Datenbankspalte?

Angenommen, ich möchte zum Beispiel alle Instanzen von catdurch ersetzen dog.

Was ist der beste Weg, dies zu tun?

Kennzeichen
quelle
7
Wenn das Googeln fehlschlägt, versuchen Sie das Handbuch: postgresql.org/docs/current/static/functions-string.html
a_horse_with_no_name

Antworten:

404

Sie wollen PostgreSQLs verwenden ersetzen Funktion:

replace(string text, from text, to text)

zum Beispiel :

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

Beachten Sie jedoch, dass dies ein String-zu-String-Ersatz ist, sodass aus "Kategorie" "Dogegory" wird. Mit der Funktion regexp_replace können Sie möglicherweise ein strengeres Übereinstimmungsmuster für das definieren, was Sie ersetzen möchten.

Jerome WAGNER
quelle
4
Hallo Leute, ich mag deine Antwort und Erklärung, es ist wirklich hilfreich. Könnten Sie bitte ein Beispiel mit regexp_replace hinzufügen? Vielen Dank!
Wim Feijen
1
Für eine bessere Granularität können Sieregexp_replace
drs
83

Der Weg des regulären Ausdrucks

Wenn Sie einen strengeren Ersatzabgleich benötigen, kann die regexp_replaceFunktion von PostgreSQL mithilfe von POSIX-Mustern für reguläre Ausdrücke übereinstimmen . Es hat die Syntax regexp_replace (Quelle, Muster, Ersetzung [, Flags]) .

Ich werde Flags iund gfür Matching ohne Berücksichtigung der Groß- und Kleinschreibung verwenden. Ich werde auch verwenden \mund \Mden Anfang und das Ende eines Wortes zu entsprechen, respectively.

Bei der Durchführung von Regex-Ersetzungen treten normalerweise einige Fallstricke auf. Mal sehen, wie einfach es ist, eine Katze durch einen Hund zu ersetzen .

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

Auch nach alledem gibt es mindestens einen ungelösten Zustand. Beispielsweise werden Sätze, die mit "Katze" beginnen, durch "Hund" in Kleinbuchstaben ersetzt, die die Großschreibung von Sätzen unterbrechen.

Alle Details finden Sie in den aktuellen PostgreSQL- Dokumenten zum Mustervergleich .

Aktualisieren Sie die gesamte Spalte mit Ersatztext

In Anbetracht meiner Beispiele wäre die sicherste Option vielleicht:

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

Sie können die replaceFunktion verwenden

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

Die Funktionsdefinition lautet wie folgt (von hier erhalten ):

replace(string text, from text, to text)

und gibt den geänderten Text zurück. Sie können sich auch diese SQL-Geige ansehen .

Ciprian Mocanu
quelle
0

Hier ist ein Beispiel, das alle Instanzen von 1 oder mehr Leerzeichen in einer Spalte durch einen Unterstrich mit regulären Ausdrücken ersetzt.

select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;
user1797212
quelle
Ich denke, es wird nur ein Backslash benötigt, bevor das "s" benötigt wird
Marty Neal