Requête SQL pour modifier une partie d'une valeur d'un champ

Requête SQL pour modifier une partie d'une valeur d'un champ - SQL/NoSQL - Programmation

Marsh Posté le 29-03-2007 à 17:10:27    

Dans une BD Mysql 3.23.58, j'ai une table où je dois remplacer pour un certain type d'enregsitrements, une partie d'une valeur d'un champ.

ex :  
Ma table "Fichiers"
ID : entier, clé primaire
Chemin : Chaîne
 
Voici qq enregsitrements
1 | http://MonSite/Rep1/AutreRep/Fichier1.doc
2 | http://MonSite/Rep1/Fichier2.txt
3 | http://AutreSite/Fichier3.pdf
4 | http://MonSite/Rep1/Rep2/Rep3/Fichier4.xls


 
Je voudrais remplacer, grâce à une requête SQL, la portion de chaîne "http://MonSite/Rep1/" par "http://NouveauSite/RepToto/RepTiti/" dans tous les enregistrements concernés (ceux qui ont dans leur champ "Chemin" la chaîne "http://MonSite/Rep1/" ). C'est possible? Merci :)


Message édité par rufo le 29-03-2007 à 17:10:43
Reply

Marsh Posté le 29-03-2007 à 17:10:27   

Reply

Marsh Posté le 29-03-2007 à 17:15:13    

Code :
  1. update Fichiers
  2. set chemin = 'http://NouveauSite/RepToto/RepTiti/' || substr(chemin,20,length(chemin))
  3. where chemin like 'http://MonSite/Rep1/%'


 
écrit pour oracle donc la syntaxe est peut-etre un peu différente, a checker aussi si le substr 20 length(chemin) couvre bien la bonen portion

Reply

Marsh Posté le 29-03-2007 à 17:18:33    

|| substr(chemin,20,length(chemin)), c'est pour garder et concaténer ce qui suit http://MonSite/Rep1/, c'est bien ça?

Reply

Marsh Posté le 29-03-2007 à 17:22:37    

pkoi pas utiliser la fonction replace plutôt ?
 
update Fichiersset chemin = replace(chemin, 'http://MonSite/Rep1/', 'http://NouveauSite/RepToto/RepTiti/')
where chemin like 'http://MonSite/Rep1/%'
 
=> le "where" est inutile si le champ "chemin" n'est pas indexé.

Reply

Marsh Posté le 29-03-2007 à 17:48:10    

j'ai lu la doc sur replace, ça va pas le faire : http://dev.mysql.com/doc/refman/5.0/fr/replace.html
 
Au mieux, ça va me virer les anciens enregistrements et m'insérer les nouveaux et dans ce cas, j'aurais plus les mêmes ID (ce qui ne me va pas du tout), au pire, ça va me laisser les anciens et m'ajouter à la fin de ma BD les nouveaux, ce qui ne me va pas non plu...
 
Cet article confirme ec que je disais : http://developpeur.journaldunet.co [...] lace.shtml


Message édité par rufo le 29-03-2007 à 17:48:44
Reply

Marsh Posté le 29-03-2007 à 17:49:39    

en mysql ça doit être str_replace ou une connerie du genre.
 
puis qu'évidement, pour faire comme d'hab, ils ont inventé l'instruction proprio "replace", qui fait que le nom était déjà pris pour l'implémentation de la fonction standard "replace"...
 
m'enfin bon, après c'est mysql, faut pas chercher plus loin


Message édité par MagicBuzz le 29-03-2007 à 17:49:49
Reply

Marsh Posté le 29-03-2007 à 17:50:40    

moi je parle de ce replace là :
http://msdn2.microsoft.com/fr-fr/library/ms186862.aspx
 
après, faut trouver sous quel nom bâtard ils ont collé ça sous mysql ;)

Reply

Marsh Posté le 29-03-2007 à 17:54:20    

a bah oui mais c'est du mssql :/ Ca m'arrange pas trop...

Reply

Marsh Posté le 29-03-2007 à 19:14:29    

mais puisque je te dis qu'il existe aussi sous mysql, mais sous un autre nom :o

Reply

Marsh Posté le 30-03-2007 à 11:23:59    

j'ai pas réussi à trouver :( Je me suis paluché la table d'index des fonctions de mysql et j'ai rien trouvé. J'ai finalement fait un petit script php qui met à jour chaque enregistrement un à un...


Message édité par rufo le 30-03-2007 à 11:24:39
Reply

Marsh Posté le 30-03-2007 à 11:23:59   

Reply

Marsh Posté le 30-03-2007 à 13:23:26    

http://dev.mysql.com/doc/refman/4. [...] tions.html ( fonction replace)
la semaine prochaine, tutorial sur la recherche dans la doc mysql

Reply

Marsh Posté le 30-03-2007 à 13:54:22    

lol, en plus c'est bien sous le nom standard :o
 
genre au caractère prêt, la requête que j'avais écrit dès le départ marche bel et bien sous MySQL :o
 
rufo, t'as droit à un seau d'eau gravier :o

Reply

Marsh Posté le 30-03-2007 à 14:04:41    

J'ai bien vu cette fonction mais je ne vois pas en quoi ça me sert à updater en 1 requête tous les enregistrements impactés.
Replace() s'utilise dans une requête de type SELECT...
A mois que ce genre de requête fonctionne :  

Code :
  1. UPDATE MaTable SET MonChamp = REPLACE(MonChamp, 'http://MonSite/Rep1/', 'http://NouveauSite/RepToto/RepTiti/') WHERE MonChamp LIKE 'http://MonSite/Rep1/%'

Reply

Marsh Posté le 30-03-2007 à 14:07:02    

évidement que ça marche :o
 
 
(et comme je disais, le WHERE est inutile à moins que ton champ chemin soit indexé)


Message édité par MagicBuzz le 30-03-2007 à 14:07:34
Reply

Marsh Posté le 30-03-2007 à 14:10:52    

bon ben je me coucherai moins bête ce soir car "une journée où on n'apprend rien est une journée de perdue!" :D

Reply

Marsh Posté le 30-04-2008 à 09:58:57    

allez hop deterage du topic
 
je voudrais faire la meme chose mais à la place de la chaine 'http://NouveauSite/RepToto/RepTiti/'
 
je voudrais mettre un champ de la table.
 
Voila requete que je tente de faire :
 
UPDATE jos_content SET title = title+" (nok)" WHERE introtext=""
 
La requete fonctionne mais aucun enregistrement n'est affecté, auriez-vous une idée d'ou ca peut venir car lorsque je fais cette requete par exemple
 
UPDATE jos_content SET title_alias = title WHERE introtext=""
 
ca modifie mes 3000 enregistrements
 
merci

Message cité 1 fois
Message édité par hardos1986 le 30-04-2008 à 09:59:21
Reply

Marsh Posté le 30-04-2008 à 10:39:53    

hardos1986 a écrit :

allez hop deterage du topic
 
je voudrais faire la meme chose mais à la place de la chaine 'http://NouveauSite/RepToto/RepTiti/'
 
je voudrais mettre un champ de la table.
 
Voila requete que je tente de faire :
 
UPDATE jos_content SET title = title+" (nok)" WHERE introtext=""
 
La requete fonctionne mais aucun enregistrement n'est affecté, auriez-vous une idée d'ou ca peut venir car lorsque je fais cette requete par exemple
 
UPDATE jos_content SET title_alias = title WHERE introtext=""
 
ca modifie mes 3000 enregistrements
 
merci


 
Je crois pas que l'operateur + marche sur les chaînes de caractère.
Essaye  
UPDATE jos_content SET title = CONCAT(title," (nok)" ) WHERE introtext=""
 

Reply

Marsh Posté le 09-08-2013 à 21:28:51    

ça fonctionne très bien    

Code :
  1. UPDATE MaTable SET MonChamp = REPLACE(MonChamp, 'http://MonSite/Rep1/', 'http://NouveauSite/RepToto/RepTiti/') WHERE MonChamp LIKE 'http://MonSite/Rep1/%'

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed