2009-10-20 7 views
2

Je suis un programmeur débutant. J'ai une page ressemble à ci-dessous. J'ai une base de données de voiture et je dois faire une recherche de base de données avec cette page. Il existe de nombreux critères que les utilisateurs peuvent entrer et sélectionner des valeurs. Mais l'utilisateur n'a pas à remplir ou sélectionner tous les critères. Par exemple, l'utilisateur peut rechercher une voiture qui ne dépend que de "Mark" ou peut rechercher qui dépend de Year = "2007" Fuel = "diesel" Gear = "Automatic" ... etc Mon problème est de savoir comment concevoir une requête qui peut détecter quels contrôles ont une valeur ou non. J'utilise C# et MSSQL Server.Comment faire une recherche avec plusieurs critères à partir d'une base de données avec SQL?

alt text http://img8.imageshack.us/img8/5781/searchad.jpg

Répondre

0

Vous pouvez composer une requête dynamique dans votre application par concaténer tous les champs qui ont des valeurs spécifiées pour eux. Par exemple "... WHERE Model = 'abc' AND Color = 'Bleu' ET ...". Les champs qui n'ont pas de valeur ne seront simplement pas inclus dans la clause WHERE. Si vous utilisez cette méthode, vous devez être très prudent lorsque vous vérifiez vos champs d'entrée pour les attaques par injection SQL.

Un meilleur moyen serait de créer une procédure stockée dans la base de données qui a des paramètres pour tous les champs d'entrée. Vous pouvez transmettre des valeurs nulles pour les champs pour lesquels l'utilisateur n'a pas entré de valeur. Cependant, vous devez vous assurer que votre SP peut gérer correctement les paramètres avec des valeurs nulles et filtrer votre jeu de résultats en conséquence.

2

Vous devriez construire votre requête assez flexible (manipulant des paramètres non remplis) pour travailler toutes les conditions de recherche. Considérez le même exemple. si l'utilisateur est entré seul le champ de la marque, et ne laissait subsister exemple de code vide

, supposons que vous avez ces paramètres

@mark varchar(20) 
@series varchar(20) 
@model varchar(20) 

select * from tbl 
where (@mark is null or [email protected]) and 
(@series is null or series [email protected]) and 
(@model is null or model [email protected]) 

Je vous conseillerais de passer tous les paramètres indivitually à SP. cela évite la construction dynamique de la requête et évitera les injections SQL.

1

Comme mentionné précédemment, faites attention à l'injection sql. Je voudrais éviter le sp avec plusieurs paramètres, car ces paramètres peuvent être tout à fait un nombre, et le sp aurait besoin de changer. En outre, la requête doit être très lente.

D'après ce que je l'ai vu, il est préférable de construire la requête dans le code, avec seulement les limitters nécessaires/filtres et éviter les

@param is null OR filed = @param

0

vous pouvez avoir quelque chose le long des lignes de

select * from cars where model like case when @model = '' then '%' else '%'[email protected]+'%' end 

et ainsi de suite. Laid, mais ça devrait marcher.

est ici une question rapide, je frappais comme un exemple

declare @model varchar(20) 
set  @model = 't' 
select * 
from (
      select 'one' as model 
      union 
      select 'two' 
      union 
      select 'three' 
     ) as model 
where model like case when @model = '' then '%' else '%'[email protected]+'%' end 

Vous ajoutez ensuite ET clauses ad infinitum, en utilisant% s quand il est vide et la chaîne de recherche en cas de besoin.

0

Linq ne crée pas l'instruction select tant qu'elle n'est pas réellement utilisée. Ainsi, vous pouvez faire quelque chose de semblable à ce qui suit:

public IQueryable<object> GetObjects(int a, string b) 
{ 
    var q = from i in items 
      where(i=>i.id == a) 
      select i; 
    if(!string.IsNullOrEmpty(b)) 
     q = q.where(o=>o.Name == b); 
    return q; 
} 

C'était hors du brassard, alors je pourrais avoir la syntaxe pas à 100%, mais il devrait être proche.

J'aurais dû le mentionner, c'est la méthode que votre formulaire appelle pour obtenir le jeu de résultats.

1

ici est un article très complet sur la façon de traiter ce sujet:

Dynamic Search Conditions in T-SQL by Erland Sommarskog

il couvre toutes les questions et les méthodes d'essayer d'écrire des requêtes avec plusieurs conditions de recherche en option

est ici la table des matières:

 
    Introduction 
     The Case Study: Searching Orders 
     The Northgale Database 
    Dynamic SQL 
     Introduction 
     Using sp_executesql 
     Using the CLR 
     Using EXEC() 
     When Caching Is Not Really What You Want 
    Static SQL 
     Introduction 
     x = @x OR @x IS NULL 
     Using IF statements 
     Umachandar's Bag of Tricks 
     Using Temp Tables 
     x = @x AND @x IS NOT NULL 
     Handling Complex Conditions 
    Hybrid Solutions – Using both Static and Dynamic SQL 
     Using Views 
     Using Inline Table Functions 
    Conclusion 
    Feedback and Acknowledgements 
    Revision History
+1

L'article d'Erland couvre définitivement tous les angles, et il vaut mieux le lire que d'essayer de re-h cendres ici. :-) –

Questions connexes