Bonjour à tous!
Pour un projet perso, j'essaye de m'amuser à "générer" une requête SQL depuis les différents éléments du WHERE stockés dans une table.
Ma requête s'effectue sur une seule table (pas de jointures donc), composée de multiples colonnes.
Mon MCD se décompose rapidement ainsi :
MA_TABLE (#personneID, sexe, poids, age ...)
CHAMP (ColonneID, ColonneLabel,) // -> Liste des colonnes dispos dans ma table. (par exemple colonneID = 2; ColonneLabel = sexe)
OPERATEUR (OperateurID, OperateurLabel) // -> Liste des différents opérateurs utilisables (<, >, <=, >=, =, OR, AND ...)
CHAMP_OPERATEUR (#ColonneID, #OperateurID) // -> Définition pour chaque colonne des différents opérateurs dispos.
DEMANDE (demandeID, demandeLabel, demandeDate) // -> Une demande, cela correspond à une requête SQL, le label pour s'y retrouver, et la date de l'éxécution.
CALCUL (#demandeID, CalculID)
DETAIL (#demandeID, #calculID, detailID, etapeID, etapeType, etapeValeur)
CALCUL_INTERACTION (#demandeID, #calculID1, #calculID2, operateurID)
En fait, mon souhait est de reconstruire la requête SQL, depuis les critères stockés.
Ma façon de raisonner est la suivante :
Je voudrais que ma petite appli sous forme de formulaire web, permette à un utilisateur novice au SQL de définir son WHERE.
Dans ce petit exemple, cela se décompose ainsi :
En bleu, les 2 calculID distints 1 et 2, qui du coup générent 2 paires de parenthèses. Ces 2 calculs sont reliés par un opérateurID ("OR" ).
En rouge, les différents opérateurs appliqués à chaque colonne.
Enfin en mauve, les valeurs.
Et à l'intérieur de chaque 'calcul', il y a donc les différentes étapes, qui peuvent être soit relatives à la définition d'une colonne, d'un opérateur, ou d'une valeur.
Dans cet exemple, la table DETAIL serait remplie ainsi :
INSERT INTO DETAIL VALUES (1, 1, 1, 1, 1 (colonne), 3 (age))
INSERT INTO DETAIL VALUES (1, 1, 1, 2, 2 (opérateur), 1 (< ))
INSERT INTO DETAIL VALUES (1, 1, 1, 3, 3 (valeur), 30)
INSERT INTO DETAIL VALUES (1, 1, 1, 4, 2 (opérateur), 4 (AND))
INSERT INTO DETAIL VALUES (1, 1, 1, 5, 1 (colonne), 2 (sexe))
INSERT INTO DETAIL VALUES (1, 1, 1, 6, 2 (opérateur), 2 (=))
INSERT INTO DETAIL VALUES (1, 1, 1, 1, 3 (valeur), Homme)
INSERT INTO DETAIL VALUES (1, 2, 1, 1, 1 (colonne), 3 (taille))
INSERT INTO DETAIL VALUES (1, 2, 1, 2, 2 (opérateur), 6 (>=))
INSERT INTO DETAIL VALUES (1, 2, 1, 3, 3 (valeur), 80)
INSERT INTO DETAIL VALUES (1, 2, 1, 4, 2 (opérateur), 4 (AND))
INSERT INTO DETAIL VALUES (1, 2, 1, 5, 1 (colonne), 5 (poids))
INSERT INTO DETAIL VALUES (1, 2, 1, 6, 2 (opérateur), 1 (< ))
INSERT INTO DETAIL VALUES (1, 2, 1, 1, 3 (valeur), 65)
INSERT INTO CALCUL_INTERACTION VALUES (1, 1, 2, 7 (OR))
Je suis en ce moment en train de faire un petit bout de code permettant de convertir ces différentes étapes en "WHERE ..." SQL.
J'arrive à boucler sur chaque calcul, puis sur chaque "étape" de ma table DETAILS propre à ce calcul, j'obtiens alors quelquechose du style :
SELECT *
FROM MA_TABLE
WHERE ((age < 30 AND SEXE = 'H') (TAILLE = 180) )
Mais comme vous le voyez, je n'arrive pas à intégrer mes "OR" ou "AND" entre mes CalculID à récupérer depuis ma table CALCUL_INTERACTION ...
Le but de mon topic est de savoir si certains d'entre vous s'étaient déjà amusé à faire ce genre de choses et vous faire partager mon avancement sur cette petite appli.
Si certains se sentent prêts à m'aider à mettre en place l'algo de génération du where, n'hésitez pas
@+