web-dev-qa-db-fra.com

MySQL peut-il remplacer plusieurs caractères?

J'essaie de remplacer un tas de caractères dans un champ MySQL. Je connais la fonction REMPLACER mais qui ne remplace qu'une chaîne à la fois. Je ne vois aucune fonction appropriée dans le manuel .

Puis-je remplacer ou supprimer plusieurs chaînes à la fois? Par exemple, je dois remplacer les espaces par des tirets et supprimer les autres signes de ponctuation.

49
DisgruntledGoat

Vous pouvez chaîner les fonctions REPLACE:

select replace(replace('hello world','world','earth'),'hello','hi')

Cela imprimera hi earth.

Vous pouvez même utiliser des sous-requêtes pour remplacer plusieurs chaînes!

select replace(london_english,'hello','hi') as warwickshire_english
from (
    select replace('hello world','world','earth') as london_english
) sub

Ou utilisez un JOIN pour les remplacer:

select group_concat(newword separator ' ')
from (
    select 'hello' as oldword
    union all
    select 'world'
) orig
inner join (
    select 'hello' as oldword, 'hi' as newword
    union all
    select 'world', 'earth'
) trans on orig.oldword = trans.oldword

Je vais laisser la traduction en utilisant des expressions de table communes comme exercice pour le lecteur;)

66
Andomar

La cascade est la seule solution simple et directe à mysql pour le remplacement de plusieurs caractères.

UPDATE table1 
SET column1 = replace(replace(REPLACE(column1, '\r\n', ''), '<br />',''), '<\r>','')
8
Anurag

J'utilise lib_mysqludf_preg pour cela, ce qui vous permet de:

Utiliser des expressions régulières PCRE directement dans MySQL

Avec cette bibliothèque installée, vous pourriez faire quelque chose comme ceci:

SELECT preg_replace('/(\\.|com|www)/','','www.example.com');

Ce qui vous donnerait:

example
4
billynoah

REPLACE fait un bon travail simple de remplacer les caractères ou les phrases partout où ils apparaissent dans une chaîne. Mais lors du nettoyage de la ponctuation, vous devrez peut-être rechercher des modèles - par exemple une séquence d'espaces ou de caractères dans des parties particulières du texte, par ex. au milieu d'un mot ou après un arrêt complet. Si tel est le cas, une fonction de remplacement d'expression régulière serait beaucoup plus puissante. La mauvaise nouvelle est MySQL ne fournit pas une telle chose mais la bonne nouvelle est qu'il est possible de fournir une solution de contournement - voir ce billet de blog .

Puis-je remplacer ou supprimer plusieurs chaînes à la fois? Par exemple, je dois remplacer les espaces par des tirets et supprimer les autres signes de ponctuation.

Ce qui précède peut être réalisé avec une combinaison du remplaçant d'expression régulière et de la fonction standard REPLACE. Il peut être vu en action dans cette démo en ligne de Rextester .

SQL (à l'exclusion du code de fonction par souci de concision):

SELECT txt,
       reg_replace(REPLACE(txt, ' ', '-'),
                   '[^a-zA-Z0-9-]+',
                   '',
                   TRUE,
                   0,
                   0
                   ) AS `reg_replaced`
FROM test;
1
Steve Chambers

sur php

$dataToReplace = [1 => 'one', 2 => 'two', 3 => 'three'];
$sqlReplace = '';
foreach ($dataToReplace as $key => $val) {
    $sqlReplace = 'REPLACE(' . ($sqlReplace ? $sqlReplace : 'replace_field') . ', "' . $key . '", "' . $val . '")';
}
echo $sqlReplace;

résultat

REPLACE(
    REPLACE(
        REPLACE(replace_field, "1", "one"),
    "2", "two"),
"3", "three");
1
asdasd