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?

n00b
la source
2
Duplication possible de MySql - Manière de mettre à jour une partie d'une chaîne?
Steve Chambers

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/

Giraldi
la source
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....
onteria_
la source
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.

Geai
la source
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;
Deepak Kumbhar
la source
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.

RafaSashi
la source