Bonjour,
Après plusieurs jours de méli-mélo intellectuel, j'en remets mon problème à la communauté.
J'ai une page web où il est possible de sélectionner des filtres pour une requête. La requête doit alors ressortir toutes les personnes répondant aux critères saisis dans la page. Ces filtres sont enregistrés dans une table sous cette forme
(a noter qu'il y a une autre table, non utilisé dans ce contexte, qui permet de stocker les informations générales de la sélection, comme le nom, un commentaire, à qui appartient la sélection, la date de création, avec pour id unique la clé étrangère ci dessous : idbase)
iddetail : identifiant unique du filtre
idbase : identifiant de la sélection
keyname : nom de la clé
keyvalue : valeur de la clé
Chacun de ces filtres sont multiples, représentés par des listes.
Les listes sont alimentées par diverses requêtes de ce type :
SELECT DISTINCT(un champ, un autre champ) FROM UTILISATEURS
où l'on récupère un identifiant (non unique sur la table) & un texte accompagnant.
L'ensemble des données est dans la table "utilisateurs" (pas de table périphérique pour stocker ces informations avec des clés étrangères)
Ainsi, si je remplis ma sélection avec 2 types de filtres sur 5, j'obtiens dans ma table de filtre :
iddetail idbase keyname keyvalue
1 1 'REGION' 'ile de france'
2 1 'REGION' 'PACA'
3 1 'SOCIETE' 'Societe X'
4 1 'SOCIETE' 'Societe Y'
5 1 'SOCIETE' 'Societe Z'
Il y a alors 5 catégories de filtres possibles :
- Région
- Société
- Responsable
- Magasin
- Responsable régional
Je voudrai alors faire une procédure stockée qui utilise les filtres renseignés dans la table et les appliquer à ma requête.
J'ai bien la solution à mon problème, mais pas assez propre à mon gout :
- Construire la requête en .NET et l'exécuter
- Construire la requête en SQL et l'exécuter via un "execute_sql"
Donc j'ai essayé plein de combinaison, mais la clé de mon problème est que lorsque aucun filtre n'est définit pour une clé donnée (keyname), il faut avoir "tous les utilisateurs".
J'ai essayé de faire l'intersection (INTERSECT) entre tous les résultats des requêtes de ce type :
SELECT
usr.*
FROM UTILISATEURS AS usr INNER JOIN MES_FILTRES AS filtre ON usr.region = filtre.keyvalue AND filtre.keyname = 'REGION' AND filtre.idbase = 1
(etc, pour chaque type de filtre)
Mais étant donné que dans l'exemple, je n'ai pas de critère de filtre pour 3 types sur 5, le result set de chacune de ces requêtes est par conséquent, NULL. L'intersect ne marche pas, et le résultat complet est NULL.
L'UNION des résultats peut être pensé, mais on obtient alors, une combinaison "OU" (OR) des filtres, et ils doivent être de ce type :
(REGION = 'IDF' OR REGION = 'PACA') AND (SOCIETE='SOCIETE_x')
S'en suit tout un tas de test divers & variés à base de UNION / INTERSECT / EXCEPT ...
Au final, mon souci est toujours le même : ne pas pouvoir agir conditionnellement sur ma requête ... Par exemple, faire tel type de jointure si filtre, ou tel type si non.
Des conseils avisés ?
Merci d'avance à celui/celle/ceux pouvant aider à la résolution de mon problème...
Partager