MySQL recherche et remplace du texte dans un champ

257

Quelle requête MySQL fera une recherche de texte et la remplacera dans un champ particulier d'une table?

C'est-à-dire rechercher fooet remplacer par barun enregistrement avec un champ avec la valeur hello foodevient hello bar.

julz
la source

Réponses:

490

Modifiez table_nameet fieldpour faire correspondre le nom et le champ de votre table en question:

UPDATE table_name SET field = REPLACE(field, 'foo', 'bar') WHERE INSTR(field, 'foo') > 0;
Joe Skora
la source
79
UPDATE [table_name] SET [field_name] = REPLACE ( [field_name], "foo", "bar");
Meetai.com
6
Je pense qu'il est plus rapide de ne pas l'utiliser WHERE instr(field, 'foo') > 0;(donc il ne ferait pas 2 recherches) ... Ai-je tort?
inemanja
2
@treddell, aucune position ne commence à 1 dans les chaînes SQL.
Alexis Wilke
2
@inemanja, @Air sans la WHEREclause vous faites un UPDATEsur toutes les lignes ...
Alexis Wilke
7
Comme Pring, si vous voulez laisser un commentaire comme ça, vous voudrez peut-être expliquer pourquoi. Était-ce une erreur dans le conseil d'origine ou une erreur de votre part? Et vous savez qu'avant d'apporter des modifications radicales à une base de données, vous êtes censé la sauvegarder en premier?
pdwalker
86
UPDATE table_name 
SET field = replace(field, 'string-to-find', 'string-that-will-replace-it');
la petite empreinte
la source
2
M'a aidé. Pour tous les noobs, veuillez supprimer les crochets.
Anantha Raju C
8
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

Comme par exemple, si je veux remplacer toutes les occurrences de John par Mark que j'utiliserai ci-dessous,

UPDATE student SET student_name = replace(student_name, 'John', 'Mark');
Umesh Patil
la source
6

Et si vous souhaitez rechercher et remplacer en fonction de la valeur d'un autre champ, vous pouvez faire un CONCAT:

update table_name set `field_name` = replace(`field_name`,'YOUR_OLD_STRING',CONCAT('NEW_STRING',`OTHER_FIELD_VALUE`,'AFTER_IF_NEEDED'));

Juste pour avoir celui-ci ici afin que les autres le trouvent immédiatement.

basdog22
la source
Si vous citez le nom du champ, assurez-vous d'utiliser le bon type de guillemets !
200_success
4

D'après mon expérience, la méthode la plus rapide est

UPDATE table_name SET field = REPLACE(field, 'foo', 'bar') WHERE field LIKE '%foo%';

Le INSTR()chemin est le deuxième plus rapide et l'omission de la WHEREclause est la plus lente, même si la colonne n'est pas indexée.

Gaspy
la source
Fonctionne pour moi car j'ai besoin d'ajouter une autre clause où. UPDATE table_name SET field = REPLACE (field, 'foo', 'bar') WHERE field LIKE '% foo%' AND otherfield = 'foo22'
Max
1

La fonction Remplacer la chaîne le fera.

Wayne
la source
Travaille pour moi. Cela dépend de la façon dont vous interprétez la question. Si vous devez modifier les entrées de la base de données, utilisez update. Sinon, cette solution est bien meilleure car elle peut être utilisée sans mettre à jour les champs.
Gruber
0

J'ai utilisé la ligne de commande ci-dessus comme suit: update TABLE-NAME set FIELD = replace (FIELD, 'And', 'and'); le but était de remplacer And par et ("A" devrait être en minuscule). Le problème est qu'il ne peut pas trouver le «et» dans la base de données, mais si j'utilise comme «% et%», il peut le trouver avec de nombreux autres ands qui font partie d'un mot ou même ceux qui sont déjà en minuscules.

Schwann
la source