Réquête multi critètres

Résolu
maintenance_info Messages postés 66 Date d'inscription lundi 5 juin 2017 Statut Membre Dernière intervention 3 janvier 2022 - 11 mai 2020 à 13:09
jacofee Messages postés 12 Date d'inscription mercredi 12 août 2020 Statut Membre Dernière intervention 16 août 2020 - 14 août 2020 à 21:52
Bonjour,
j'ai un formulaire de recherche en c# ,
selon les champs rempli par l'utilisateur(l'utilisateur peut remplir un ou deux ou trois ou tout les champs)une requête sql sera exécuter.

1 réponse

jacofee Messages postés 12 Date d'inscription mercredi 12 août 2020 Statut Membre Dernière intervention 16 août 2020 1
14 août 2020 à 21:52
Bonjour,

Vu la date, le besoin n'existe vraisemblablement plus pour maintenance_info, mais la réponse peut intéresser quelqu'un d'autre.

Je vois deux techniques pour faire ce travail, chacune coûtant assez cher, quoique ce qualificatif soit très relatif. Ici je parle de jointure parce que je ne sais pas si les champs présentés figurent dans une seule table ou dans plusieurs, le dernier cas nécessitant une jointure.

1) Concaténer tous les champs C# séparés par des % dans une seule chaîne de caractères, concaténer de même les colonnes de la jointure, mais sans les %, et filtrer les lignes retournées par la jointure par un LIKE. L'opération peut nécessiter une conversion de type pour les champs qui ne sont pas de type caractère. On aura donc quelque chose comme :
jointure.Client +  jointure.Article + [...] + format(jointure.Date_fin, 'dd/mm/yyyy') LIKE '%' + formulaire.Client + '%' + formulaire.Article + '%' + [...] + '%' + format(formulaire.Date_fin, 'dd/mm/yyyy') +'%' 

L'expression [...] remplace ici toutes les colonnes et champs du formulaire qui ne sont pas repris dans mon exemple pour éviter de le surcharger.

2) Comparer tous les champs C# un par un avec la colonne correspondante retournée par la jointure. Les expressions de comparaisons sont articulées entre elle par des OR.

En termes de performances, les deux expressions sont équivalentes. L'utilisation de OR dans une clause WHERE induit la création de boucles lors de l'exécution de la requête, ce qui ralentit le processus. Il en est de même pour le mot LIKE qui va entraîner l'examen de toutes les lignes, les index n'étant pas utilisables ici parce que la chaîne cible commence par un %. Il est donc important de s'assurer de réduire le set de lignes à comparer avec une autre condition logique chaque fois que cela est possible.
Je ne donne pas ici le code à implémenter, ce dernier dépendant trop du langage C# et du dialecte SQL utilisés.

Cordialement,
0