MySQL sucht und ersetzt Text in einem Feld

257

Welche MySQL-Abfrage führt eine Textsuche durch und ersetzt sie in einem bestimmten Feld in einer Tabelle?

Suche also nach foound ersetzen barso ein Datensatz mit einem Feld mit dem Wert hello foowird hello bar.

julz
quelle

Antworten:

490

Ändern Sie table_nameund fieldpassen Sie Ihren Tabellennamen und das betreffende Feld an:

UPDATE table_name SET field = REPLACE(field, 'foo', 'bar') WHERE INSTR(field, 'foo') > 0;
  • REPLACE (Zeichenfolgenfunktionen)
  • INSTR (String-Funktionen)
Joe Skora
quelle
79
UPDATE [Tabellenname] SET [Feldname] = REPLACE ( [field_name], "foo", "bar");
Meetai.com
6
Ich denke, es ist schneller, es nicht zu verwenden WHERE instr(field, 'foo') > 0;(es würde also keine 2 Suchvorgänge durchführen) ... irre ich mich?
Inemanja
2
@treddell, in SQL-Strings beginnen keine Positionen bei 1.
Alexis Wilke
2
@inemanja, @Air ohne die WHEREKlausel, die Sie UPDATEin allen Zeilen machen ...
Alexis Wilke
7
Wenn Sie wie Pring einen solchen Kommentar hinterlassen möchten, möchten Sie vielleicht erklären, warum. War es ein Fehler im ursprünglichen Rat oder ein Fehler von Ihrer Seite? Und Sie wissen, dass Sie, bevor Sie umfassende Änderungen an einer Datenbank vornehmen, diese zuerst sichern sollten?
pdwalker
86
UPDATE table_name 
SET field = replace(field, 'string-to-find', 'string-that-will-replace-it');
das Kleingedruckte
quelle
2
Half mir. Bitte entfernen Sie für alle Noobs die eckigen Klammern.
Anantha Raju C
8
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

Wie zum Beispiel, wenn ich alle Vorkommen von John durch Mark ersetzen möchte, werde ich unten verwenden,

UPDATE student SET student_name = replace(student_name, 'John', 'Mark');
Umesh Patil
quelle
6

Und wenn Sie basierend auf dem Wert eines anderen Felds suchen und ersetzen möchten, können Sie eine CONCAT durchführen:

update table_name set `field_name` = replace(`field_name`,'YOUR_OLD_STRING',CONCAT('NEW_STRING',`OTHER_FIELD_VALUE`,'AFTER_IF_NEEDED'));

Nur um dieses hier zu haben, damit andere es sofort finden.

basdog22
quelle
4

Nach meiner Erfahrung ist die schnellste Methode

UPDATE table_name SET field = REPLACE(field, 'foo', 'bar') WHERE field LIKE '%foo%';

Der INSTR()Weg ist der zweitschnellste und das Weglassen der WHEREKlausel insgesamt ist am langsamsten, selbst wenn die Spalte nicht indiziert ist.

Keuchend
quelle
Funktioniert für mich, weil ich eine weitere Klausel hinzufügen muss, wo. UPDATE Tabellenname SET Feld = REPLACE (Feld, 'foo', 'bar') WHERE Feld WIE '% foo%' UND otherfield = 'foo22'
Max
1

Die Funktion "Zeichenfolge ersetzen" übernimmt dies.

Wayne
quelle
Funktioniert bei mir. Es hängt davon ab, wie Sie die Frage interpretieren. Wenn Sie die Datenbankeinträge ändern müssen, verwenden Sie update. Ansonsten ist diese Lösung viel besser, da sie ohne Aktualisierung der Felder verwendet werden kann.
Gruber
0

Ich habe die obige Befehlszeile wie folgt verwendet: update TABLE-NAME set FIELD = replace (FIELD, 'And', 'und'); Der Zweck war, Und durch und zu ersetzen ("A" sollte Kleinbuchstaben sein). Das Problem ist, dass es das "Und" in der Datenbank nicht finden kann, aber wenn ich "% und%" verwende, kann es es zusammen mit vielen anderen Ands finden, die Teil eines Wortes sind oder sogar solche, die bereits in Kleinbuchstaben geschrieben sind.

Schwann
quelle