Perché un'istruzione UPDATE SET REPLACE () corrisponde alle righe, ma non ne modifica nessuna e non fornisce avvisi?


9

Sto cercando una determinata stringa in un campo e voglio sostituirla con una nuova stringa. In particolare, desidero che tutti i riferimenti a un URL vengano cambiati in un altro URL. Ho creato questa istruzione SQL e la sto eseguendo su un mysql>prompt su CentOS 5.5 utilizzando MySQL Community Server 5.1.54.

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

La risposta è:

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

Come posso rintracciare perché non vengono apportate modifiche?

MODIFICA 1:

Grazie ad Aaron Bertrand, ho scoperto che REPLACE()non è in grado di gestire i caratteri jolly e lo stavo usando in modo completamente sbagliato (pensa: WHEREclausola mancante ). Ecco la mia dichiarazione riformata:

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

A cui ricevo il vecchio, familiare:

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

Cosa potrei fare di sbagliato?

MODIFICA 2:

Ti dirò cosa stavo facendo di sbagliato !! Non mettevo in discussione ipotesi. La mia ipotesi era che la stringa che stavo sostituendo fosse in tutte le lettere minuscole. La clausola WHERE stava restituendo tutte le cose che sembravanoLIKE %companydomain.com%. Ciò include tutte le permutazioni di capitalizzazione come CompanyDomain.com, CoMpAnYdOmAiN.com ed ecc.

Passò quello a REPLACE()cui poi cercava rigorosamente companydomain.com per sostituirlo con companydomain.org.

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

Quindi ovviamente i miei dischi venivano restituiti, ma nulla veniva sostituito. Una volta modificato REPLACE()per tenere conto della capitalizzazione, tutti i record sono stati aggiornati e sembra che tutto vada bene. La REPLACE()sintassi corretta per il mio scenario era quindi:

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

Risposte:


12

REPLACEnon gioca con i caratteri jolly in quel modo. Penso che volevi dire:

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

Non hai alcuna WHEREclausola, quindi ha tentato di aggiornare 618 righe, ma non ha trovato alcuna istanza %TLD.com%in quella colonna. Per vedere quali righe devono essere interessate, esegui SELECTinvece un :

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

0

Innanzitutto, dobbiamo verificare utilizzando una selectquery:

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

Successivamente, dobbiamo aggiornare:

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

Risultati: Cloud &amp Enterprise ComputingCloud & Enterprise Computing

Infine, dobbiamo fare domanda per tutti:

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

Risultati: Corporate &amp Insolvency LawCorporate & Insolvency Law

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.