Come sostituire una stringa nei records di una tabella in un database Mysql / MariaDB
Capita spesso di avere l'esigenza di trovare e sostituire ("find & replace") una stringa presente all'interno di uno o più records di una tabella, in un database MySql.
Ad esempio potremmo voler sostituire un valore numerico con uno differente, un nome con un'altro, una url con un'altra.
Vediamo come operatore su tutti i records della tabella anzichè andare a cercare e modificare, ad uno ad uno, i record interessati.
MySQL rende disponbile la funzione REPLACE(), la cui sintassi è:
REPLACE(campo, find_string, replace_with)
I tre parametri da passare alla funzione sono
- campo: è il campo della tabella su cui vogliamo effettuare il replace
- find_string: è la stringa che stiamo cercando
- replace_with: è il valore che andremo ad inserire al posto di find_string
Vediamo subito in azione questa funzione, con un esempio.
All'interno una tabella "aziende", nel campo "codice_postale", cerchiamo i valori "10128" e li sostituiamo con "10121".
UPDATE aziende SET codice_postale = REPLACE(codice_postale, '10128', '10121');
Così facendo abbiamo effettuato un UPDATE di tutti i records che hanno come codice di avviamento postare il valore 10128.
Nulla vieta di effettuare un REPLACE in una SELECT invece che un UPDATE. In questo caso i records non verranno aggiornati.
SELECT id, cognome, nome, REPLACE(codice_postale, '10128', '10121') AS new_codice_postale FROM aziende
Replace di più stringhe con un unico update
Potremmo avere l'esigenza di sostutuire più valori e non solo uno come nel caso precedente.
Ad esempio, nella nostra tabella "aziende", per un problema di encoding abbiamo salvato, nel campo "nome", alcuni caratteri in questo modo: ¬, ¹, ¨
Potrebbe esserti capitato se salvi i caratteri con encoding UTF8 in un campo con encoding Latin1 (ISO-8859-1).
Dobbiamo quindi procedere con la loro sostituzione
- ¬ con ì
- ¹ con ù
- ¨ con è
Facciamo quindi l'UPDATE
UPDATE aziende SET nome=REPLACE(nome, 'ì', 'ì')
Dovremmo ripetere la procedura per tutti i valori da sostiture, oppure possiamo procedere con una unica query, più articolata, concatenando i vari REPLACE in questo modo
UPDATE aziende SET nome=REPLACE(REPLACE(REPLACE(nome, '¹', 'ù'), '¨', 'è'), 'ì', 'ì')
Nota finale. la funzione REPLACE è case-sensitive: significa che se, ad esempio, devi sostiture un carattere Maiuscolo, devi indicarlo come tale e non minuscolo.
Al prossimo articolo. Stay tuned!