Réquête multi critètres

Signaler
Messages postés
51
Date d'inscription
lundi 5 juin 2017
Statut
Membre
Dernière intervention
11 mai 2020
-
Messages postés
12
Date d'inscription
mercredi 12 août 2020
Statut
Membre
Dernière intervention
16 août 2020
-
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

Messages postés
12
Date d'inscription
mercredi 12 août 2020
Statut
Membre
Dernière intervention
16 août 2020
1
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,