MySQL-String ersetzen

559

Ich habe eine Spalte mit URLs (ID, URL):

http://www.example.com/articles/updates/43
http://www.example.com/articles/updates/866
http://www.example.com/articles/updates/323
http://www.example.com/articles/updates/seo-url
http://www.example.com/articles/updates/4?something=test

Ich möchte das Wort "Updates" in "Nachrichten" ändern. Ist das mit einem Skript möglich?

n00b
quelle

Antworten:

1283
UPDATE your_table
SET your_field = REPLACE(your_field, 'articles/updates/', 'articles/news/')
WHERE your_field LIKE '%articles/updates/%'

Nun Reihen, die wie waren

http://www.example.com/articles/updates/43

wird sein

http://www.example.com/articles/news/43

http://www.electrictoolbox.com/mysql-find-replace-text/

Giraldi
quelle
23
Kurze Frage, ist es wirklich notwendig, die "WHERE" -Klausel zu haben?
John Crawford
55
@ JohnCrawford Laut dem Artikel im Link: "Sie müssen die WHERE LIKEKlausel nicht unbedingt am Ende hinzufügen , denn wenn der zu findende Text nicht vorhanden ist, wird die Zeile nicht aktualisiert, aber es sollte die Dinge beschleunigen . ""
Giraldi
3
Mit der WHERE-Klausel können Sie genau steuern, was ersetzt wird. Ohne eine wird jede Zeile überprüft und möglicherweise werden Daten ersetzt, wenn eine Übereinstimmung gefunden wird.
Carlton
11
Ich glaube in diesem Fall ist das WHERE nutzlos, weil a LIKE '%%'keine Indizes verwendet, wenn es andere Teile in diesem WHERE gäbe, zum Beispiel etwas wie date_added > '2014-07-01'es hätte helfen können
Fabrizio
13
Ich komme immer hierher als Referenz, wenn ich etwas in MySQL ersetzen muss
Daniel Pecher
141

Ja, MySQL hat eine REPLACE () -Funktion:

mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
    -> 'WwWwWw.mysql.com'

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace

Beachten Sie, dass es einfacher ist, wenn Sie dies bei der Verwendung als Alias ​​festlegen SELECT

SELECT REPLACE(string_column, 'search', 'replace') as url....
onteria_
quelle
Solange die OPs updatesnur einmal in der Zeichenfolge angezeigt werden, würde dies funktionieren. Andernfalls stecken Sie in der direkten Manipulation von Zeichenfolgen fest, was in MySQL ein echtes Problem darstellt. An diesem Punkt wäre es einfacher, ein einmaliges Skript zu schreiben, um die Felder auszuwählen, im Client zu manipulieren und dann zurückzuschreiben.
Marc B
20

Die Ersetzungsfunktion sollte für Sie funktionieren.

REPLACE(str,from_str,to_str)

Gibt den String str zurück, wobei alle Vorkommen des Strings from_str durch den String to_str ersetzt werden. REPLACE()führt bei der Suche nach from_str eine Übereinstimmung zwischen Groß- und Kleinschreibung durch.

Jay
quelle
9

Sie können einfach die Funktion replace () verwenden.

mit where-Klausel-

update tabelName set columnName=REPLACE(columnName,'from','to') where condition;

ohne wo Klausel-

update tabelName set columnName=REPLACE(columnName,'from','to');

Hinweis: Die obige Abfrage, wenn Sie Datensätze direkt in der Tabelle aktualisieren möchten, wenn Sie eine ausgewählte Abfrage wünschen und die Daten in der Tabelle nicht betroffen sein sollen, kann die folgende Abfrage verwenden:

select REPLACE(columnName,'from','to') as updateRecord;
Deepak Kumbhar
quelle
6

Zusätzlich zu gmaggios Antwort, wenn Sie dynamisch REPLACEund UPDATEgemäß einer anderen Spalte arbeiten müssen, können Sie zum Beispiel Folgendes tun:

UPDATE your_table t1
INNER JOIN other_table t2
ON t1.field_id = t2.field_id
SET t1.your_field = IF(LOCATE('articles/updates/', t1.your_field) > 0, 
REPLACE(t1.your_field, 'articles/updates/', t2.new_folder), t1.your_field) 
WHERE...

In meinem Beispiel ist die Zeichenfolge articles/news/in gespeichert, other_table t2und LIKEdie WHEREKlausel muss nicht verwendet werden.

RafaSashi
quelle