2010-11-24 2 views
138

Nous avons une base de données qui a un tas d'enregistrements avec quelques mauvaises données dans une colonne, dans lequel un éditeur intégré a échappé à des choses qui n'auraient pas dû être échappées et il brise les liens générés.Comment utiliser mySQL replace() pour remplacer des chaînes dans plusieurs enregistrements?

Je veux exécuter une requête pour remplacer les mauvais caractères dans tous les enregistrements, mais ne peux pas comprendre comment le faire. J'ai trouvé the replace() function dans MySQL, mais comment puis-je l'utiliser dans une requête?

Par exemple, quelle serait la syntaxe correcte si je voulais remplacer la chaîne &lt; avec une réelle moins que le support d'angle (<) dans tous les dossiers qui ont &lt; dans la colonne articleItem? Peut-il être fait dans une seule requête (c.-à-d. Sélectionner et remplacer tous en un seul coup), ou dois-je faire plusieurs requêtes? Même s'il s'agit de plusieurs requêtes, comment utiliser replace() pour remplacer la valeur d'un champ sur plusieurs enregistrements?

+4

avant de vous faire quoi que ce soit, assurez-vous de sauvegarder la base de données ainsi. Vous utiliserez également la mise à jour pour mettre à jour n'importe quel champ. – Matt

+1

duplication possible de [MySql - moyen de mettre à jour une partie d'une chaîne?] (Http://stackoverflow.com/questions/1876762/mysql-way-to-update-portion-of-a-string) –

+0

Copie possible de [ MySQL recherche et remplace du texte dans un champ] (http://stackoverflow.com/questions/125230/mysql-search-and-replace-some-text-in-a-field) – zgormez

Répondre

321

À un niveau très générique

UPDATE MyTable 

SET StringColumn = REPLACE (StringColumn, 'SearchForThis', 'ReplaceWithThis') 

WHERE SomeOtherColumn LIKE '%PATTERN%' 

Dans votre cas, vous dites que ceux-ci ont été échappés mais puisque vous ne spécifiez pas comment ils ont été échappés, disons qu'ils ont échappé à GREATERTHAN

UPDATE MyTable 

SET StringColumn = REPLACE (StringColumn, 'GREATERTHAN', '>') 

WHERE articleItem LIKE '%GREATERTHAN%' 

Étant donné que votre requête va réellement fonctionner à l'intérieur de la chaîne, votre clause WHERE faisant sa correspondance de modèle est peu susceptible d'améliorer les performances - elle va en fait générer plus de travail pour le serveur. Sauf si vous avez une autre OIVENT clause qui va faire cette requête de meilleurs résultats, vous pouvez simplement faire une mise à jour comme celui-ci:

UPDATE MyTable 
SET StringColumn = REPLACE (StringColumn, 'GREATERTHAN', '>') 

Vous pouvez également imbriquer plusieurs REPLACE appels

UPDATE MyTable 
SET StringColumn = REPLACE (REPLACE (StringColumn, 'GREATERTHAN', '>'), 'LESSTHAN', '<') 

Vous pouvez également faites ceci quand vous sélectionnez les données (par opposition à quand vous l'enregistrez).

Ainsi, au lieu de:

SELECT MyURLString From MyTable

Vous pouvez faire

SELECT REPLACE (MyURLString, 'GREATERTHAN', '>') as MyURLString From MyTable

+7

quibble mineur: GREATERTHAN est '>' –

20
UPDATE some_table SET some_field = REPLACE(some_field, '&lt;', '<')
+0

Correction des '' <''. Vous devez utiliser l'encodage de &, comme ceci: '&' :) –

+0

Je l'ai réédité. Merci de me le faire savoir. Il m'est apparu quelques instants après que j'ai dit que je ne savais pas comment. C'est comme ça que mon monde fonctionne. :) – simshaun

4

Cocher cette

UPDATE some_table SET some_field = REPLACE("Column Name/String", 'Search String', 'Replace String') 

Par exemple, avec chaîne exemple:

UPDATE some_table SET some_field = REPLACE("this is test string", 'test', 'sample') 

EG avec colonne/Nom du champ:

UPDATE some_table SET some_field = REPLACE(columnName, 'test', 'sample') 
4

vous pouvez écrire une procédure stockée comme ceci:

CREATE PROCEDURE de TABLE()

BEGIN

espace #replace avec underscore

MISE À JOUR Table SET FieldName = REPLACE (FieldName, » », "_") OÙ FieldName n'est pas NULL;

#delete point

UPDATE Tableau SET NomChamp = REPLACE (NomChamp "." "") OÙ NomChamp est pas NULL;

#delete (

UPDATE Tableau SET NomChamp = REPLACE (NomChamp", ("," ") O WH Nom du champ n'est pas NULL;

#delete)

UPDATE Tableau SET NomChamp = REPLACE (NomChamp, ")", "") OÙ NomChamp est pas NULL ;

#raplace ou supprimer tout omble chevalier que vous voulez

# ..........................

END

De cette façon, vous disposez d'un contrôle modulaire sur la table.

Vous pouvez également généraliser la procédure stockée rendant, paramétrique avec table à sanitoze paramètre d'entrée

+0

ces vérifications nuls sont redondantes – kiedysktos

+0

Existe-t-il des outils simples et sûrs pour créer une procédure stockée mysql? –

Questions connexes