Por que uma instrução UPDATE SET REPLACE () corresponde a linhas, mas não altera e não fornece avisos?

9

Estou procurando uma determinada string em um campo e quero substituí-la por uma nova. Especificamente, desejo que todas as referências a um URL sejam alteradas para outro URL. Eu criei essa instrução SQL e a estou executando em um mysql>prompt no CentOS 5.5 usando o MySQL Community Server 5.1.54.

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

A resposta é:

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

Como posso rastrear por que nenhuma alteração está sendo feita?

EDIT 1:

Graças a Aaron Bertrand, descobri que REPLACE()não pode lidar com curingas e estava usando-o completamente errado (pense: WHEREcláusula ausente ). Aqui está a minha declaração reformada:

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

Ao qual recebo o velho, familiar:

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

O que eu poderia estar fazendo de errado?

EDIT 2:

Vou te contar o que estava fazendo de errado !! Eu não estava questionando suposições. Minha suposição era que a string que eu estava substituindo estava em letras minúsculas. A cláusula WHERE estava retornando todas as coisas que pareciamLIKE %companydomain.com%. Isso inclui todas as permutações de capitalização, como CompanyDomain.com, CoMpAnYdOmAiN.com e etc.

Ele passou aquilo para o REPLACE()qual, então, procurava estritamente o companydomain.com para substituí-lo pelo companydomain.org.

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

É claro que meus registros estavam sendo devolvidos, mas nada estava sendo substituído. Depois que mudei REPLACE()para levar em conta a capitalização, todos os registros foram atualizados e parece que tudo está bem. A REPLACE()sintaxe correta para o meu cenário foi assim:

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

Respostas:

12

REPLACEnão brinca com curingas dessa maneira. Eu acho que você quis dizer:

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

Você não possui WHEREcláusula, portanto, tentou atualizar 618 linhas, mas não encontrou nenhuma instância %TLD.com%dessa coluna. Para ver quais linhas devem ser afetadas, execute um SELECT:

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

Primeiro, temos que verificar usando uma selectconsulta:

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

Em seguida, temos que atualizar:

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

Resultados: Cloud &amp Enterprise ComputingCloud & Enterprise Computing

Finalmente, temos que aplicar para todos:

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

Resultados: Corporate &amp Insolvency LawCorporate & Insolvency Law

Salomão
fonte