¿Por qué una instrucción UPDATE SET REPLACE () coincidiría con filas, pero no cambiaría ninguna y no daría advertencias?

9

Estoy buscando una determinada cadena en un campo y quiero reemplazarla con una nueva cadena. Específicamente, quiero que todas las referencias a una URL se cambien a otra URL. He creado esta declaración SQL y la estoy ejecutando en un mysql>indicador en CentOS 5.5 usando MySQL Community Server 5.1.54.

update [table] set [field] = REPLACE([field],'%domain.com%','%domain.org%');

La respuesta es:

Query OK, 0 rows affected (0.02 sec)
Rows matched: 618  Changed: 0  Warnings: 0

¿Cómo puedo rastrear por qué no se realizan cambios?

EDITAR 1:

Gracias a Aaron Bertrand, descubrí que REPLACE()no puede manejar comodines y lo estaba usando completamente mal (piense: WHEREcláusula faltante ). Aquí está mi declaración reformada:

UPDATE [table]
SET [column] =
REPLACE (
    [column],
    'companydomain.com',
    'companydomain.org' )
WHERE
    [column]
LIKE
    '%companydomain.com%';

A lo que recibo lo viejo y familiar:

Query OK, 0 rows affected (0.02 sec)
Rows matched: 167  Changed: 0  Warnings: 0

¿Qué podría estar haciendo mal?

EDITAR 2:

¡Te diré lo que estaba haciendo mal! No cuestionaba los supuestos. Mi suposición fue que la cadena que estaba reemplazando estaba en minúsculas. La cláusula WHERE estaba devolviendo todo lo que parecíaLIKE %companydomain.com%. Eso incluye todas las permutaciones de capitalización como CompanyDomain.com, CoMpAnYdOmAiN.com y etc.

REPLACE()Transmitió eso a lo que luego estaba buscando estrictamente companydomain.com para luego reemplazarlo por companydomain.org.

REPLACE (
    [column],
    'companydomain.com',
    'companydomain.org' )

Entonces, por supuesto, mis registros fueron devueltos, pero nada fue reemplazado. Una vez que cambié REPLACE()para tener en cuenta la capitalización, todos los registros se actualizaron y parece que todo está bien. La REPLACE()sintaxis correcta para mi escenario era así:

REPLACE (
    [column],
    'CompanyDomain.com',
    'companydomain.org' )
Wesley
fuente

Respuestas:

12

REPLACEno juega con comodines de esa manera. Creo que quisiste decir:

UPDATE [table] 
  SET [column] = REPLACE([column],'TLD.com','TLD.org')
  WHERE [column] LIKE '%TLD.com%';

No tiene una WHEREcláusula, por lo que intentó actualizar 618 filas, pero no encontró ninguna instancia %TLD.com%en esa columna. Para ver qué filas deberían verse afectadas, ejecute un SELECTen su lugar:

SELECT [column], REPLACE([column], 'TLD.com', 'TLD.org') AS new_value
  FROM [table]
  WHERE [column] LIKE '%TLD.com%';
Aaron Bertrand
fuente
0

Primero, tenemos que verificar usando una selectconsulta:

SELECT * FROM colleges
WHERE course_name LIKE '%&amp%'

A continuación, tenemos que actualizar:

UPDATE colleges
SET course_name = REPLACE(course_name, '&amp', '&')
WHERE id = 1

Resultados: Cloud &amp Enterprise ComputingCloud & Enterprise Computing

Finalmente, tenemos que aplicar para todos:

UPDATE colleges
SET course_name = REPLACE(course_name, '&amp', '&')

Resultados: Corporate &amp Insolvency LawCorporate & Insolvency Law

Salomón
fuente