IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Comment supprimer un ID faisant partie d'une liste dans un champ string ?


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 477
    Par défaut Comment supprimer un ID faisant partie d'une liste dans un champ string ?
    bonjour,

    j'ai un champs string qui se comportent comme une liste de IDS, par exemple

    id,nom,liste
    1 toto 1,2,52
    2 julie 1,5,3
    3 dupont 15,5,6
    4 sarah 5
    6 julien 5,4
    si je veux retirer l'élément 5 dans les champs 'liste', c-a-d supprimer '5' de la chaine liste , comment faire en une étape ?

    je dis bien en une étape, car je sais que je peux le faire en 4 étapes (des sql update avec replace). j'ai 4 étapes car je ne peux pas juste faire un replace du 5 sinon je vais bousiller les 52,15 et je dois gérer le positionnement de la virgule !
    Mysql n'a-t-il pas une fonction intégrée pour gérer les champs de type liste ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 442
    Par défaut
    Bonjour,
    tu peux utiliser nu CASE dans la "partie" affectation" de la colonne:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    update MaTable
    set MaColonne = case 
    when Macolonne = '5' then null
    when MaColonne like '5,%' then right(MaColonne, length(MaColonne) - 2
    when MaColonne like '%,5' then Left(MaColonne, length(MaColonne) - 2
    else MaColonne = replace(MaColonne, ',5,','')

    Tu peux ajouter nu filtre pour ne prendre que les lignes concernées, mais dans tous les cas aucun index ne sera éligible ici.

    Tatayo.

  3. #3
    Membre éprouvé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 477
    Par défaut
    oui , une requête avec 4 cases est moins couteux en serveur que 4 update..
    ça reste une écriture sql "encombrante"
    n'y-a-t-il pas dans mysql (comme en php), des fonctions spécifiques aux "array" ?
    si c'était le cas j'aurai pu utiliser "WHERE 5 IN macolonne" pour déjà mieux cibler

    dommage que ya pas pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE matable set macolonne=enlever(5) where  5 IN macolonne "

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 442
    Par défaut
    Mysql propose la fonction REGEXP_REPLACE() qui doit faire le job.

    Il ne te reste plus qu'à trouver l'expression régulière qui va bien.

    Tatayo.

  5. #5
    Membre éprouvé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 477
    Par défaut
    je suis pas très à l'aise avec le RegX , je viens de voir qu'il y a la fonction TRIM, je vais peut-être arriver à réduire les cas...
    https://www.w3resource.com/mysql/str...m-function.php

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Cela démontre une fois de plus qu'avec un modèle de données mal construit on rencontre rapidement des problèmes qui ne peuvent être résolus de manière simple.
    On ne gère pas une liste dans une colonne ! On crée une table fille pour y placer la liste.

    Au lieu de la table Table1(#Id_T1, Attributs_T1, ListeDeValeurs), il faudrait Table1(#Id_T1, Attributs_T1) et Table2(*Id_T1, Valeur), avec une seule valeur de la liste dans chaque ligne.
    Et là, plus de contorsion pour trouver une valeur dans la liste, la supprimer, la remplacer...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/03/2019, 11h05
  2. Extraire un élément faisant partie d'une variable dans une regexp
    Par byrdo dans le forum Programmation et administration système
    Réponses: 9
    Dernier message: 17/04/2009, 15h21
  3. Afficher un partie d'une valeur dans un champ
    Par curt dans le forum VBA Access
    Réponses: 2
    Dernier message: 29/11/2007, 17h39
  4. Réponses: 13
    Dernier message: 18/05/2007, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo