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

Langage SQL Discussion :

Parser SQL - Algorithme


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 15
    Par défaut Parser SQL - Algorithme
    Bonjour à tous,

    j'utilise un langage particulier d'un gros ERP, qui n'est vraiment pas doué en SQL. A ce titre, j'ai développé une sorte d'éditeur SQL, mais je bloque sur un point, l'analyse de la syntaxe. En effet, j'ai besoin de connaitre les champs sélectionnés, et les tables auquels ils font référence (ou bien leur type).

    Google ne m'a pas spécialement aidé, bien qu'un certain nombre de versions plus ou moins payante dans différents langage existent.

    A défaut de trouver un code source d'un Parser existant quelconque dans n'importe quel langage (si qqun connais je suis preneur !! ), quel serait la logique, l'algo a respecter pour mettre ça en oeuvre ?

    J'ai cru comprendre qu'il fallait initier un arbre avec des noeuds comprendant les différents mots de la requête, mais je ne vois pas vraiment comment.

    Idéalement, ce parser devrait pouvoir interpréter des select de select, ainsi que les decode, nvl, etc.

    Merci d'avance de vos idées/retours !

    NiKro

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    Billets dans le blog
    14
    Par défaut
    Ce n'est peut-être pas dans le forum "Langage SQL" que tu auras une réponse adéquate ! C'est plutôt de la programmation !

    Pour quand même te mettre sur la piste, tu peux décomposer la chaîne SQL en morceaux :
    - Ce qui est compris entre SELECT et FROM est normalement constitué de colonnes et éventuellement d'alias, de fonctions de calcul, de branchements (CASE)...
    - Ce qui est compris entre FROM et WHERE ou jusqu'à la fin de la chaîne SQL est constitué de tables avec éventuellement des jointures et leurs conditions ;
    - Ce qui est compris entre WHERE et GROUP BY ou ORDER BY ou jusqu'à la fin est contitué de conditions de restriction sur les données ;
    - Ce qui est compris entre GROUP BY et HAVING ou ORDER BY ou jusqu'à la fin est constitué de colonnes qui doivent normalement figurer parmi la liste des colonnes du SELECT ;
    - Ce qui est compris entre HAVING et ORDER BY ou jusqu'à la fin est constitué de conditions de restriction sur les regroupements de données ;
    - Ce qui est compris entre ORDER BY et la fin est constitué de colonnes et éventuellement de clauses d'ordre (ASC ou DESC)

    Mais bon... bonjour le boulot !

    Bon courage !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 15
    Par défaut
    Merci de ta réponse !

    En effet, j'ai hésité à poster dans une autre section, comme Algorithme, mais je suppose qu'il vaut mieux éviter de poster n fois le même message dans différentes section

    Pour le découpage de la requête, en effet, avec des RegEx, j'arrive à peu près à récupérer ce qu'il y a entre SELECT et FROM, mais dès que j'envisage des cas plus complexe, je bloque. Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Select A.champ_bis, C.ch
      From ( Select champ As champ_bis
               From matable1, matable2
              Where clé1 = clé2) A
      Join matable C
        on ...
    Je peux certes convenir de limiter les syntaxes complexes, mais l'idéal serait d'en traiter au moins quelques unes

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    Billets dans le blog
    14
    Par défaut
    Ce qui serait bien déjà, c'est d'avoir une seule syntaxe pour les jointures : la normalisée depuis 1992 avec JOIN !

    Après c'est vrai que dans le cas que tu donnes et par rapport à ce que j'ai donné comme piste tout à l'heure :
    - Ce qui est compris entre FROM et WHERE ou jusqu'à la fin de la chaîne SQL est constitué de tables avec éventuellement des jointures et leurs conditions ;
    il y a deux FROM de suite et un WHERE intermédiaire !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    Les parenthèses servent à séparer les groupes, le parser peut les utiliser.

  6. #6
    Membre confirmé
    Inscrit en
    Février 2003
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 36
    Par défaut
    sinon, une petite piste qui peut peut etre te mettre sur la voie...

    grosso modo, tu parses ta chaine de charactere avec une sorte de boucle,
    des bon ptit charindex pour trouver la position de chaque from
    et avec des substring, des len (de charindex de "from" ou "select" etc...), en partant du dernier "from" rencontré jusqu'au premier, tu devrais pouvoir decouper et parser ta chaine comme tu le souhaites.
    je sais pas si je suis super clair, mais je ne pense pas que ce soit insurmontable (attention, je parle de sqlserver).

    Bon courage a toi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cherche parser SQL
    Par freud dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/08/2013, 19h24
  2. Parser SQL java
    Par smetairie dans le forum Général Java
    Réponses: 2
    Dernier message: 14/08/2009, 11h18
  3. tableau php ver SQL | algorithme pour former l'arborescence
    Par spy74 dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 17/01/2009, 12h13
  4. Parser SQL en java
    Par boutss dans le forum JDBC
    Réponses: 1
    Dernier message: 22/12/2008, 13h36
  5. [C++] Parser SQL
    Par batbaille dans le forum Langage SQL
    Réponses: 1
    Dernier message: 30/10/2005, 18h43

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