Pourquoi une instruction UPDATE SET REPLACE () correspondrait-elle à des lignes, mais n'en changerait aucune et ne donnerait aucun avertissement?

9

Je cherche une certaine chaîne dans un champ et je veux la remplacer par une nouvelle chaîne. Plus précisément, je souhaite que toutes les références à une URL soient remplacées par une autre URL. J'ai conçu cette instruction SQL et je l'exécute à l' mysql>invite sur CentOS 5.5 à l'aide de MySQL Community Server 5.1.54.

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

La réponse est:

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

Comment savoir pourquoi aucune modification n'est apportée?

EDIT 1:

Grâce à Aaron Bertrand, j'ai découvert que je REPLACE()ne peux pas gérer les caractères génériques et je l'utilisais complètement mal (pensez: WHEREclause manquante ). Voici ma déclaration réformée:

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

À qui je reçois l'ancien, familier:

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

Que pourrais-je faire de mal?

EDIT 2:

Je vais vous dire ce que je faisais mal !! Je ne remettais pas en question les hypothèses. Mon hypothèse était que la chaîne que je remplaçais était en minuscules. La clause WHERE renvoyait tout ce qui semblaitLIKE %companydomain.com%. Cela inclut toutes les permutations de capitalisation telles que CompanyDomain.com, CoMpAnYdOmAiN.com, etc.

Il a transmis ce REPLACE()qui cherchait alors strictement companydomain.com pour le remplacer par companydomain.org.

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

Alors bien sûr, mes dossiers étaient retournés, mais rien n'était remplacé. Une fois que j'ai changé REPLACE()pour tenir compte de la capitalisation, tous les enregistrements ont été mis à jour et il semble que tout va bien. La REPLACE()syntaxe correcte pour mon scénario était donc:

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

Réponses:

12

REPLACEne joue pas avec les caractères génériques de cette façon. Je pense que vous vouliez dire:

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

Vous n'avez aucune WHEREclause, il a donc essayé de mettre à jour 618 lignes, mais il n'a trouvé aucune instance de %TLD.com%dans cette colonne. Pour voir quelles lignes doivent être affectées, exécutez SELECTplutôt a:

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

Tout d'abord, nous devons vérifier à l'aide d'une selectrequête:

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

Ensuite, nous devons mettre à jour:

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

Résultats: Cloud &amp Enterprise ComputingCloud & Enterprise Computing

Enfin, nous devons postuler pour tous:

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

Résultats: Corporate &amp Insolvency LawCorporate & Insolvency Law

Salomon
la source