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.

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;

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');

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');

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.



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.


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.


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.

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.