Sostituzione stringa MySQL


560

Ho una colonna contenente url (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

Vorrei cambiare la parola "aggiornamenti" in "notizie". È possibile farlo con uno script?


Risposte:


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

Ora file che erano come

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

sarà

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

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


23
Domanda veloce, è davvero necessario avere la clausola "WHERE"?
John Crawford,

55
@JohnCrawford Secondo l'articolo nel link: "Non devi necessariamente aggiungere la WHERE LIKEclausola alla fine, perché se il testo da trovare non è lì la riga non verrà aggiornata, ma dovrebbe accelerare le cose . "
Giraldi,

3
La clausola WHERE offre un controllo specifico su ciò che viene sostituito. Senza uno ogni riga verrà controllata e potenzialmente sostituiti i dati se viene trovata una corrispondenza.
Carlton,

11
Credo che in questo caso il WHERE sia inutile perché a LIKE '%%'non usa alcun indice, se ci fossero altre parti in quel WHERE, per esempio qualcosa di simile date_added > '2014-07-01'avrebbe potuto aiutare
Fabrizio,

13
Vengo sempre qui come riferimento quando devo sostituire qualcosa in mysql
Daniel Pecher,

141

Sì, MySQL ha una funzione REPLACE ():

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

Nota che è più semplice se lo usi come alias SELECT

SELECT REPLACE(string_column, 'search', 'replace') as url....

Fintanto che l'OP updatesappare una sola volta nella stringa, allora funzionerebbe. Altrimenti sei bloccato con la manipolazione diretta delle stringhe che è un vero dolore in MySQL. A quel punto sarebbe più semplice scrivere uno script una tantum per selezionare i campi, manipolarli nel client, quindi riscrivere.
Marc B,

20

La funzione di sostituzione dovrebbe funzionare per te.

REPLACE(str,from_str,to_str)

Restituisce la stringa str con tutte le occorrenze della stringa from_str sostituita dalla stringa to_str. REPLACE()esegue una corrispondenza con distinzione tra maiuscole e minuscole durante la ricerca di from_str.


9

Puoi semplicemente usare la funzione di sostituzione (),

con dove clausola-

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

senza dove clausola-

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

Nota: la query precedente se per i record di aggiornamento direttamente nella tabella, se si desidera selezionare la query e i dati non devono essere interessati nella tabella, è possibile utilizzare la query seguente:

select REPLACE(columnName,'from','to') as updateRecord;

6

Oltre alla risposta di gmaggio se hai bisogno di fare dinamicamente REPLACEe UPDATEsecondo un'altra colonna puoi fare per esempio:

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...

Nel mio esempio la stringa articles/news/è archiviata other_table t2e non è necessario utilizzarla LIKEnella WHEREclausola.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.