2010-11-24 7 views
138

Tenemos una base de datos que tiene un montón de registros con algunos datos incorrectos en una columna, en los que un editor incrustado escapó algunas cosas que no deberían haberse escapado y está rompiendo enlaces generados.¿Cómo puedo usar mySQL replace() para reemplazar cadenas en múltiples registros?

Quiero ejecutar una consulta para reemplazar los caracteres incorrectos en todos los registros, pero no puedo encontrar la manera de hacerlo. Encontré the replace() function en MySQL, pero ¿cómo puedo usarlo dentro de una consulta?

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

+4

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

+1

posible duplicado de [MySql - Forma de actualizar la parte de una cadena?] (Http://stackoverflow.com/questions/1876762/mysql-way-to-update-portion-of-a-string) –

+0

Posible duplicado de [ MySQL busca y reemplaza texto en un campo] (http://stackoverflow.com/questions/125230/mysql-search-and-replace-some-text-in-a-field) – zgormez

Respuesta

321

A un nivel muy genérico

UPDATE MyTable 

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

WHERE SomeOtherColumn LIKE '%PATTERN%' 

En su caso usted dice estas se escaparon, pero ya que no especifica la forma en que se escaparon, digamos que se escaparon a GREATERTHAN

UPDATE MyTable 

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

WHERE articleItem LIKE '%GREATERTHAN%' 

Debido a que su consulta funcionará realmente dentro de la cadena, es probable que su cláusula WHERE haciendo su coincidencia de patrones no mejore ningún rendimiento; de hecho, generará más trabajo para el servidor. A menos que tenga otra DONDE miembro de cláusula que se va a hacer esta consulta se desempeñan mejor, sólo tiene que hacer una actualización de esta manera:

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

También puede anidar múltiples REPLACE llamadas

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

También puede Haga esto cuando seleccione los datos (en lugar de cuando los guarda).

Así que en lugar de:

SELECT MyURLString From MyTable

Usted podría hacer

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

+7

objeción menor: GREATERTHAN es '>' –

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

Se corrigió el '<' s. Necesitará usar la codificación de &, así: '&' :) –

+0

Lo reedité. Gracias por hacérmelo saber. Me di cuenta momentos después de que dije que no sabía cómo. Esa es la forma en que mi mundo funciona. :) – simshaun

4

Marque esta

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

por ejemplo, con cadena de ejemplo:

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

por ejemplo, con nombre de columna/campo:

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

se puede escribir un procedimiento almacenado de esta manera:

CREAR PROCEDIMIENTO sanitize_ TABLA()

COMENZAR

espacio #replace con subrayado

ACTUALIZACIÓN Tabla SET FieldName = REPLACE (FieldName,"", "_") DONDE FieldName no es NULO;

dot #delete

ACTUALIZACIÓN Tabla SET FieldName = REPLACE (FieldName, "." "") DONDE FieldName no es NULL;

#delete (

ACTUALIZACIÓN Tabla SET FieldName = REPLACE (FieldName," ("," ") WHERE FieldName no es NULL;

#delete)

ACTUALIZACIÓN Tabla SET FieldName = REPLACE (FieldName, ")", "") DONDE FieldName no es NULL ;

#raplace o eliminar cualquier carbón desea

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

END

De esta manera tiene control modular sobre la mesa.

También puede generalizar procedimiento almacenado por lo que es, paramétrica con mesa de sanitoze parámetro de entrada

+0

esas comprobaciones nulas son redundantes – kiedysktos

+0

¿Hay alguna herramienta fácil y segura para crear el procedimiento almacenado de mysql? –

Cuestiones relacionadas