2009-11-04 139 views
38

Estoy tratando de reemplazar un grupo de caracteres en un campo MySQL. Conozco la función SUSTITUIR, pero eso solo reemplaza una cadena a la vez. No puedo ver ninguna función apropiada in the manual.¿Puede MySQL reemplazar múltiples caracteres?

¿Puedo reemplazar o eliminar varias cadenas a la vez? Por ejemplo, necesito reemplazar espacios con guiones y eliminar otros signos de puntuación.

Respuesta

50

Puede reemplazar la cadena de funciones:

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

Esto imprimirá hi earth.

¡Incluso puede usar subconsultas para reemplazar varias cadenas!

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

o utilizar un JOIN para reemplazarlos:

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 

Dejaré traducción utilizando expresiones de tabla comunes como ejercicio para el lector;)

+1

qué !? no, no lo hará :) – Zak

+0

@ Zak: eh ... ¿de verdad leíste la consulta? Lo editaré;) – Andomar

+1

Lo siento, para poner en la pregunta que he estado usando REPLACES anidados. Esperaba algo similar a la función 'str_replace' de PHP, pero supongo que no existe. – DisgruntledGoat

0

que sugeriría la ejecución de un programa para recorra sus registros, procese los campos y luego actualícelos. Tal vez una simple secuencia de comandos perl o php.

+6

Creo que OP está buscando una solución SQL. –

5

La conexión en cascada es la única solución simple y directa para mysql para el reemplazo de múltiples caracteres.

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

Como se observó en otra respuesta, ** esto podría no funcionar **. El reemplazo de cadena A B C con C D E, por ejemplo, reemplazará A con C, * y luego reemplazará C con E *, de modo que "HAL" no se convertirá en "HCL" sino "HEL". – LSerni

1

REPLACE hace un buen trabajo simple de reemplazar caracteres o frases que aparecen por todas partes en una cadena. Pero cuando limpie la puntuación, es posible que deba buscar patrones, p. una secuencia de espacios en blanco o caracteres en partes particulares del texto, p. en medio de una palabra o después de un punto. Si ese es el caso, una función de reemplazo de expresión regular sería mucho más poderosa. La mala noticia es MySQL doesn't provide such a thing, pero la buena noticia es que es posible proporcionar una solución alternativa: consulte this blog post.

¿Puedo reemplazar o eliminar varias cadenas a la vez? Por ejemplo, necesito para reemplazar espacios con guiones y eliminar otros signos de puntuación.

Lo anterior se puede lograr con una combinación del sustituto de expresión regular y la función estándar REPLACE. Se puede ver en acción en this online Rextester demo.

SQL (excluyendo el código de función por razones de brevedad):

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

He estado usando lib_mysqludf_preg para este, que le permite: expresiones regulares

Uso PCRE directamente MySQL

Con esto biblioteca instalada que podría hacer algo como esto:

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

que le daría:

example 
Cuestiones relacionadas