web-dev-qa-db-fra.com

Comment utiliser mySQL replace () pour remplacer des chaînes dans plusieurs enregistrements?

Nous avons une base de données qui contient une série d'enregistrements avec certaines données incorrectes dans une colonne, dans laquelle un éditeur intégré échappe à des éléments qui n'auraient pas dû être ignorés et rompent les liens générés.

Je veux lancer une requête pour remplacer les caractères incorrects dans tous les enregistrements, mais je ne vois pas comment le faire. J'ai trouvé la fonction replace() _ dans MySQL, mais comment puis-je l'utiliser dans une requête?

Par exemple, quelle serait la syntaxe correcte si je souhaitais remplacer la chaîne &lt; par un crochet inférieur à l'angle réel (<) dans tous les enregistrements comportant &lt; dans le articleItem colonne? Peut-on le faire en une seule requête (c'est-à-dire tout sélectionner et tout remplacer d'un 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 dans plusieurs enregistrements?

160
EmmyS

À 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 précisez pas comment ils ont été échappés, supposons qu'ils se soient échappés GREATERTHAN

UPDATE MyTable

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

WHERE articleItem LIKE '%GREATERTHAN%'

Etant 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 réalité générer plus de travail pour le serveur. Sauf si vous avez un autre membre de la clause WHERE qui améliorera cette requête, vous pouvez simplement faire une mise à jour comme celle-ci:

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

Vous pouvez également imbriquer plusieurs appels REPLACE

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

Vous pouvez également le faire lorsque vous sélectionnez les données (et non lorsque vous les enregistrez).

Donc au lieu de:

SELECT MyURLString From MyTable

Vous pourriez faire

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

382
Raj More
UPDATE some_table SET some_field = REPLACE(some_field, '&lt;', '<')
22
simshaun

Vérifie ça

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

Exemple avec exemple de chaîne:

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

EG avec nom de colonne/champ:

UPDATE some_table SET some_field = REPLACE(columnName, 'test', 'sample')
6
Lead Developer

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

CREATE PROCEDURE désinfecter _TABLE ()

COMMENCER

# remplace l'espace par un trait de soulignement

UPDATE Table SET Nom du champ = REPLACE ( Nom du champ , "", "_") O FieldName n'est pas NULL;

# effacer un point

UPDATE Table SET Nom du champ = REPLACE ( Nom du champ , ".", "") O FieldName n'est pas NULL;

# delete (

UPDATE Table SET Nom du champ = REPLACE ( Nom du champ , "(", "") O FieldName n'est pas NULL;

# delete)

UPDATE Table SET Nom du champ = REPLACE ( Nom du champ , ")", "") O FieldName n'est pas NULL;

# raplace ou supprime le caractère que tu veux

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

FIN

De cette façon, vous avez un contrôle modularisé sur la table.

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

4
Gianluca D'Ardia