2009-11-04 48 views
38

Ich versuche, eine Reihe von Zeichen in einem MySQL-Feld zu ersetzen. Ich kenne die REPLACE-Funktion, die aber immer nur eine Zeichenfolge ersetzt. Ich kann keine geeigneten Funktionen in the manual sehen.Kann MySQL mehrere Zeichen ersetzen?

Kann ich mehrere Zeichenfolgen gleichzeitig ersetzen oder löschen? Zum Beispiel muss ich Leerzeichen durch Bindestriche ersetzen und andere Satzzeichen entfernen.

Antwort

50

können Sie Kette REPLACE Funktionen:

select replace(replace('hello world','world','earth'),'hello','hi') 

Dies wird hi earth drucken.

Sie können sogar Unterabfragen verwenden, um mehrere Strings zu ersetzen!

select replace(london_english,'hello','hi') as warwickshire_english 
from (
    select replace('hello world','world','earth') as london_english 
) sub 

Oder sie ersetzen JOIN:

select group_concat(newword separator ' ') 
from (
    select 'hello' as oldword 
    union all 
    select 'world' 
) orig 
inner join (
    select 'hello' as oldword, 'hi' as newword 
    union all 
    select 'world', 'earth' 
) trans on orig.oldword = trans.oldword 

Ich werde verlassen Übersetzung mit gemeinsamem Tabellenausdrücken als eine Übung für den Leser;)

+1

was !? nein wird es nicht :) – Zak

+0

@Zak: eh ... richtig, lesen Sie tatsächlich die Abfrage? Ich bearbeite es;) – Andomar

+1

Sorry, ich wollte die Frage stellen, ich habe verschachtelte REPLACEs verwendet. Ich habe auf etwas ähnlich wie PHP 'str_replace'-Funktion gehofft, aber ich denke, dass es nicht existiert. – DisgruntledGoat

0

Ich würde vorschlagen, ein Programm laufen Schleife über deine Aufzeichnungen, bearbeite die Felder und aktualisiere sie dann. Vielleicht ein einfaches Perl- oder PHP-Skript.

+6

Ich glaube, dass das OP nach einer SQL-Lösung sucht. –

5

Cascading ist die einzige einfache und unkomplizierte Lösung für MySQL zum Ersetzen mehrerer Zeichen.

UPDATE table1 
SET column1 = replace(replace(REPLACE(column1, '\r\n', ''), '<br />',''), '<\r>','') 
+0

Wie in einer anderen Antwort beobachtet, ** funktioniert das möglicherweise nicht **. Das Ersetzen von A B C durch C D E beispielsweise ersetzt A mit C * und ersetzt dann C durch E *, so dass "HAL" nicht "HCL", sondern "HEL" wird. – LSerni

1

REPLACE macht einen guten Job einfach von Zeichen oder Phrasen überall erscheinen sie in einer Zeichenfolge zu ersetzen. Aber wenn Sie die Interpunktion bereinigen, müssen Sie möglicherweise nach Mustern suchen - z. eine Folge von Leerzeichen oder Zeichen in bestimmten Teilen des Textes, z. in der Mitte eines Wortes oder nach einem Punkt. Wenn das der Fall ist, wäre eine reguläre Ausdruckersetzungsfunktion viel mächtiger. Die schlechte Nachricht ist MySQL doesn't provide such a thing, aber die gute Nachricht ist, dass es möglich ist, eine Problemumgehung bereitzustellen - siehe this blog post.

Kann ich mehrere Strings gleichzeitig ersetzen oder löschen? Zum Beispiel brauche ich , um Leerzeichen durch Bindestriche zu ersetzen und andere Satzzeichen zu entfernen.

Das obige kann mit einer Kombination aus dem regulären Ausdruck Ersatz und der Standard REPLACE Funktion erreicht werden. Es kann in Aktion in this online Rextester demo gesehen werden.

SQL (mit Ausnahme der Funktionscode der Kürze halber):

SELECT txt, 
     reg_replace(REPLACE(txt, ' ', '-'), 
        '[^a-zA-Z0-9-]+', 
        '', 
        TRUE, 
        0, 
        0 
        ) AS `reg_replaced` 
FROM test; 
1

Ich habe für diese Verwendung lib_mysqludf_preg, die Ihnen ermöglicht:

Verwenden PCRE reguläre Ausdrücke direkt in MySQL

Mit diesem Bibliothek installiert man so etwas tun könnte:

SELECT preg_replace('/(\\.|com|www)/','','www.example.com'); 

Welche würden Sie geben:

example