¿Cómo puedo usar mySQL replace () para reemplazar cadenas en múltiples registros?


166

Tenemos una base de datos que tiene un montón de registros con algunos datos incorrectos en una columna, en la que un editor incrustado escapó de algunas cosas que no deberían haberse escapado y está rompiendo los enlaces generados.

Quiero ejecutar una consulta para reemplazar los caracteres incorrectos en todos los registros, pero no puedo entender cómo hacerlo. Encontré la replace()función en MySQL, pero ¿cómo puedo usarla dentro de una consulta?

Por ejemplo, ¿cuál sería la sintaxis correcta si quisiera reemplazar la cadena &lt;con un corchete real menor que el ángulo ( <) en todos los registros que tienen &lt;en la articleItemcolumna? ¿Se puede hacer en una sola consulta (es decir, seleccionar y reemplazar todo de una vez), o tengo que hacer varias consultas? Incluso si se trata de múltiples consultas, ¿cómo utilizo replace()para reemplazar el valor de un campo en más de un registro?


55
antes de hacer nada, asegúrese de hacer una copia de seguridad de la base de datos también. También usaría actualizar para actualizar cualquier campo.
Matt


Posible duplicado de la búsqueda
zgormez

Respuestas:


395

A un nivel muy genérico

UPDATE MyTable

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

WHERE SomeOtherColumn LIKE '%PATTERN%'

En su caso, dice que estos se escaparon, pero como no especifica cómo se escaparon, digamos que se escaparon a GREATERTHAN

UPDATE MyTable

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

WHERE articleItem LIKE '%GREATERTHAN%'

Dado que su consulta realmente funcionará dentro de la cadena, WHEREes poco probable que su cláusula que hace la coincidencia de patrones mejore el rendimiento; en realidad, generará más trabajo para el servidor. A menos que tenga otro miembro de la cláusula WHERE que hará que esta consulta funcione mejor, simplemente puede hacer una actualización como esta:

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

También puedes anidar múltiples REPLACEllamadas

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

También puede hacer esto cuando selecciona los datos (a diferencia de cuando los guarda).

Entonces en lugar de:

SELECT MyURLString From MyTable

Podrías hacerlo

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


77
objeción menor: GREATERTHAN es '>'
Olivier Dulac

23
UPDATE some_table SET some_field = REPLACE(some_field, '&lt;', '<')

Arreglado el &lt;s. Necesitas usar la codificación de &, así: &amp;:)
Dan J

Lo reedité. Gracias por hacérmelo saber. Caí en la cuenta momentos después de que dije que no sabía cómo. Así funciona mi mundo. :)
simshaun

6

Mira esto

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

Por ejemplo, con una cadena de muestra:

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

EG con columna / nombre de campo:

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

4

puedes escribir un procedimiento almacenado como este:

PROCEDIMIENTO DE CREACIÓN sanitize_ TABLE ()

EMPEZAR

# reemplazar espacio con guión bajo

ACTUALIZAR tabla SET FieldName = REPLACE ( FieldName , "", "_") DONDE FieldName no es NULL;

#delete dot

ACTUALIZAR tabla SET FieldName = REPLACE ( FieldName , ".", "") DONDE FieldName no es NULL;

#Eliminar (

ACTUALIZAR tabla SET FieldName = REPLACE ( FieldName , "(", "") DONDE FieldName no es NULL;

#Eliminar )

ACTUALIZAR tabla SET FieldName = REPLACE ( FieldName , ")", "") DONDE FieldName no es NULL;

#raplace o elimine cualquier carácter que desee

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

FINAL

De esta forma tiene un control modularizado sobre la mesa.

También puede generalizar el procedimiento almacenado haciéndolo, paramétrico con la tabla para sanitar el parámetro de entrada


1
esos cheques nulos son redundantes
kiedysktos

¿Existen herramientas fáciles y seguras para crear un procedimiento almacenado mysql?
Ivan Slaughter

0

Esto te ayudara.

UPDATE play_school_data SET title= REPLACE(title, "&#39;", "'") WHERE title = "Elmer&#39;s Parade";

Resultado:

title = Elmer's Parade
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.