Wie ersetze ich in postgresql alle Instanzen einer Zeichenfolge in einer Datenbankspalte?
Angenommen, ich möchte zum Beispiel alle Instanzen von cat
durch ersetzen dog
.
Was ist der beste Weg, dies zu tun?
Wie ersetze ich in postgresql alle Instanzen einer Zeichenfolge in einer Datenbankspalte?
Angenommen, ich möchte zum Beispiel alle Instanzen von cat
durch ersetzen dog
.
Was ist der beste Weg, dies zu tun?
Antworten:
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.
regexp_replace
Wenn Sie einen strengeren Ersatzabgleich benötigen, kann die regexp_replace
Funktion 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 i
und g
für Matching ohne Berücksichtigung der Groß- und Kleinschreibung verwenden. Ich werde auch verwenden \m
und \M
den 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 .
In Anbetracht meiner Beispiele wäre die sicherste Option vielleicht:
UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');
Sie können die replace
Funktion 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 .
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;