Reemplazo de cadena MySQL

560

Tengo una columna que contiene las URL (id, url):

http://www.example.com/articles/updates/43
http://www.example.com/articles/updates/866
http://www.example.com/articles/updates/323
http://www.example.com/articles/updates/seo-url
http://www.example.com/articles/updates/4?something=test

Me gustaría cambiar la palabra "actualizaciones" a "noticias". ¿Es posible hacer esto con un script?

n00b
fuente
2
Posible duplicado de MySql: ¿forma de actualizar parte de una cadena?
Steve Chambers el

Respuestas:

1285
UPDATE your_table
SET your_field = REPLACE(your_field, 'articles/updates/', 'articles/news/')
WHERE your_field LIKE '%articles/updates/%'

Ahora filas que eran como

http://www.example.com/articles/updates/43

estarán

http://www.example.com/articles/news/43

http://www.electrictoolbox.com/mysql-find-replace-text/

Giraldi
fuente
23
Pregunta rápida, ¿es realmente necesario tener la cláusula "DÓNDE"?
John Crawford
55
@JohnCrawford Según el artículo en el enlace: "No necesariamente tiene que agregar la WHERE LIKEcláusula al final, porque si el texto para encontrar no está allí, la fila no se actualizará, pero debería acelerar las cosas" . "
Giraldi
3
La cláusula WHERE le brinda un control específico sobre lo que se reemplaza. Sin una, cada fila se verificará y se reemplazarán los datos si se encuentra una coincidencia.
Carlton
11
Creo que en este caso el DÓNDE es inútil porque a LIKE '%%'no usa ningún índice, si hubiera otras partes en ese DÓNDE, por ejemplo, algo así date_added > '2014-07-01'podría haber ayudado
Fabrizio
13
Siempre vengo aquí como referencia cuando necesito reemplazar algo en mysql
Daniel Pecher
141

Sí, MySQL tiene una función REPLACE ():

mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
    -> 'WwWwWw.mysql.com'

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace

Tenga en cuenta que es más fácil si lo convierte en un alias al usar SELECT

SELECT REPLACE(string_column, 'search', 'replace') as url....
onteria_
fuente
Mientras el OP updatessolo se muestre una vez en la cadena, esto funcionaría. De lo contrario, está atascado con la manipulación directa de cadenas, lo cual es un verdadero dolor en MySQL. En ese punto, sería más fácil escribir una secuencia de comandos única para seleccionar los campos, la manipulación en el cliente y luego volver a escribir.
Marc B
20

La función de reemplazo debería funcionar para usted.

REPLACE(str,from_str,to_str)

Devuelve la cadena string con todas las apariciones de la cadena from_str reemplazadas por la cadena to_str. REPLACE()realiza una coincidencia entre mayúsculas y minúsculas al buscar from_str.

Arrendajo
fuente
9

Simplemente puede usar la función replace (),

con cláusula where-

update tabelName set columnName=REPLACE(columnName,'from','to') where condition;

sin cláusula where-

update tabelName set columnName=REPLACE(columnName,'from','to');

Nota: La consulta anterior si para los registros de actualización directamente en la tabla, si desea seleccionar la consulta y los datos no deberían verse afectados en la tabla, puede usar la siguiente consulta:

select REPLACE(columnName,'from','to') as updateRecord;
Deepak Kumbhar
fuente
6

Además de la respuesta de gmaggio si necesita dinámicamente REPLACEy de UPDATEacuerdo con otra columna, puede hacer, por ejemplo:

UPDATE your_table t1
INNER JOIN other_table t2
ON t1.field_id = t2.field_id
SET t1.your_field = IF(LOCATE('articles/updates/', t1.your_field) > 0, 
REPLACE(t1.your_field, 'articles/updates/', t2.new_folder), t1.your_field) 
WHERE...

En mi ejemplo, la cadena articles/news/se almacena other_table t2y no hay necesidad de usarla LIKEen la WHEREcláusula.

RafaSashi
fuente