Remplacement de la chaîne MySQL


560

J'ai une colonne contenant des 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

J'aimerais changer le mot «mises à jour» en «nouvelles». Est-il possible de le faire avec un script?


Réponses:


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

Maintenant, les lignes qui étaient comme

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

sera

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

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


23
Question rapide, est-il vraiment nécessaire d'avoir la clause "WHERE"?
John Crawford

55
@JohnCrawford Selon l'article du lien: "Vous n'avez pas nécessairement à ajouter la WHERE LIKEclause à la fin, car si le texte à rechercher n'est pas là, la ligne ne sera pas mise à jour, mais cela devrait accélérer les choses . "
Giraldi

3
La clause WHERE vous donne un contrôle spécifique sur ce qui est remplacé. Sans une, chaque ligne sera vérifiée et potentiellement les données seront remplacées si une correspondance est trouvée.
Carlton

11
Je crois que dans ce cas, le WHERE est inutile car a LIKE '%%'n'utilise aucun index, s'il y avait d'autres parties dans ce WHERE, par exemple quelque chose comme date_added > '2014-07-01'ça aurait pu aider
Fabrizio

13
Je viens toujours ici pour référence quand j'ai besoin de remplacer quelque chose dans mysql
Daniel Pecher

141

Oui, MySQL a une fonction 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

Notez qu'il est plus facile de créer un alias lors de l'utilisation SELECT

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

Tant que les OP n'apparaissent updatesqu'une seule fois dans la chaîne, cela fonctionnera. Sinon, vous êtes coincé avec la manipulation directe de chaînes, ce qui est vraiment pénible dans MySQL. À ce stade, il serait plus facile d'écrire un script unique pour sélectionner les champs, la manipulation dans le client, puis réécrire.
Marc B

20

La fonction de remplacement devrait fonctionner pour vous.

REPLACE(str,from_str,to_str)

Renvoie la chaîne str avec toutes les occurrences de la chaîne from_str remplacées par la chaîne to_str. REPLACE()effectue une correspondance sensible à la casse lors de la recherche de from_str.


9

Vous pouvez simplement utiliser la fonction replace (),

avec clause where-

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

sans clause where-

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

Remarque: La requête ci-dessus si pour les enregistrements de mise à jour directement dans la table, si vous souhaitez sélectionner la requête et que les données ne doivent pas être affectées dans la table, vous pouvez utiliser la requête suivante:

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

6

En plus de la réponse de gmaggio si vous avez besoin de dynamiquement REPLACEet UPDATEselon une autre colonne, vous pouvez faire par exemple:

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

Dans mon exemple, la chaîne articles/news/est stockée dans other_table t2et il n'est pas nécessaire d'utiliser LIKEdans la WHEREclause.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.