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 :

Substr ou équivalent


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 152
    Points : 87
    Points
    87
    Par défaut Substr ou équivalent
    Bonjour,

    J'ai une base de données sur laquelle je souhaiterais faire une jointure sur un champ, or pour ceci je dois extraire une partie d'une chaîne pour la comparer à un autre champs.

    J'ai la table upa qui contient un champ combination contenant des informations sous la forme suivante :
    upa.combination => a:1{i:3;s:1:"7";}
    ou
    upa.combination => a:1{i:3;s:2:"14";}

    Je dois comparer la valeur comprise dans les guillemets qui peut contenir 1 ou 2 caractères, donc si je fais un substr, je ne saurais pas comment récupérer uniquement la valeur contenue entre les guillemets.

    Comment puis-je faire?

    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Salut en SQL standard je ne sais pas si on peut extraire des sous-chaines..
    avec le SQL spécifique au SGBDR oui c'est possible je crois que c'est possible avec MS SQL-Server notamment.
    Mais autrement je ne vois pas..
    Lorsqu'on fait un requête SQL c'est sur un champ particulier et sa valeur en intégralité.
    Peut-être qu'en utilisant des "tokens" mais c'est assez limité.
    Donc à part utiliser le langage de programmation du SGBDR ou bien le langage du client ( par exemple requête SQL avec Oracle ou MS SQL Server puis traitement en C# ) je ne vois pas autrement..

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 152
    Points : 87
    Points
    87
    Par défaut
    dans mon cas c'est MySQL, j'ai tenté un truc et qui étrangement a fonctionné mais c'est bizarre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT JOIN uc_attribute_options on substr(uc_product_adjustments.combination,15, 2)=uc_attribute_options.oid
    Quand j'ai 7 normalement ça devrait me retourner 7" mais la jointure fonctionne ça m'affiche bien la ligne correspondant à l'oid = 7

    Est-ce que le " est supprimé comme il s'agit d'un oid correspondant à un int ?

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Vos valeurs ressemblent fort à des données multiples enregistrées dans une seule colonne, ce qui contrevient fortement au principe des bases de données relationnelles.
    Si ce n'est pas trop tard, revoyez votre structure de données !

    Ce qui est bizarre aussi avec votre requête par rapport à vos données, c'est que, si je compte bien, le 7 apparaît en 14ème position et pas en 15ème !

    Et si par hasard ce qui précède le nombre recherché comporte un ou plusieurs caractères supplémentaires, vous aurez un résultat faux.

    Il faut jouer un peu plus finement avec les fonctions texte de MySQL pour chercher la position du premier guillemet et prendre les caractères qui suivent jusqu'au second guillemet. Pas le temps de chercher ça maintenant mais c'est la piste à suivre.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 152
    Points : 87
    Points
    87
    Par défaut
    malheureusement ce n'est pas moi qui l'ai créé, sinon je ne me serais pas compliquée tant la vie ;-)

    C'est la base de donnée issue du module ubercart de drupal.

    Pour ce qui est de la fonction substr je comprends ses limites, d'où l'objet de mon post.

    Justement j'aurais aimé savoir s'il existait une fonction en SQL qui pourrait me retourner les caractères compris entre guillemets.

    Pour ce qui du 14ème caractère j'ai du me tromper en recopiant voici un copier coller des valeurs de ma base

    a:1:{i:3;s:2:"14";}
    ou
    a:1:{i:3;s:1:"7";}

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Développement par étapes...

    Position du premier guillemet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT INSTR('a:1:{i:3;s:2:"14";}', '"')
    ==> 14

    On garde les derniers caractères de la chaîne à partir de la position 14 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT RIGHT('a:1:{i:3;s:2:"14";}', LENGTH('a:1:{i:3;s:2:"14";}') - INSTR('a:1:{i:3;s:2:"14";}', '"'))
    ==> 14";}

    Position du premier guillemet dans ce morceau restant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT INSTR(RIGHT('a:1:{i:3;s:2:"14";}', LENGTH('a:1:{i:3;s:2:"14";}') - INSTR('a:1:{i:3;s:2:"14";}', '"')), '"')
    ==> 3

    On garde les caractères de gauche avant la position 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
      LEFT(
        RIGHT('a:1:{i:3;s:2:"14";}', LENGTH('a:1:{i:3;s:2:"14";}') - INSTR('a:1:{i:3;s:2:"14";}', '"')),
        INSTR(RIGHT('a:1:{i:3;s:2:"14";}', LENGTH('a:1:{i:3;s:2:"14";}') - INSTR('a:1:{i:3;s:2:"14";}', '"')), '"')
        - 1
      )
    ==> 14

    Il suffit de remplacer la valeur par le nom de la colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
      LEFT(
        RIGHT(combination, LENGTH(combination) - INSTR(combination, '"')),
        INSTR(RIGHT(combination, LENGTH(combination) - INSTR(combination, '"')), '"')
        - 1
      )
    FROM uc_product_adjustments
    Je ne sais pas s'il y a plus simple mais a priori ça fonctionne, si toutes les "combination" sont formatées pareil.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 152
    Points : 87
    Points
    87
    Par défaut
    merci pour cette réponse précise, je vais examiner toutes ces fonctions ensemble car je ne suis pas trop à l'aise avec ces fonctions.

    En tout les cas bravo, car j'étais loin d'imaginer une telle solution.

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/08/2003, 14h47
  2. [sous-chaine] Avec strpos ou substring ??
    Par terziann dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 17/07/2003, 15h28
  3. [postgreSQL] équivalent de la function 'instr'
    Par Dra_Gun dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2003, 16h09
  4. Équivalent du #IFDEF
    Par agh dans le forum Langage
    Réponses: 4
    Dernier message: 14/10/2002, 18h44
  5. Réponses: 2
    Dernier message: 10/07/2002, 11h51

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