2010-01-06 4 views
3

Je dois exécuter une requête SQL en fonction des conditions. Deux conditions AND doivent être exécutées uniquement si les conditions if pour elles sont satisfaites. Pouvons-nous utiliser l'instruction CASE ici. Si c'est le cas, comment? Ou y a-t-il d'autres méthodes?Donner des conditions dans l'instruction SQL SELECT

SELECT * FROM MyTable 
WHERE [email protected] 

if condition1 here 
AND col2 = @val2 
end if 

if condition2 here 
AND col3 = @val3 
end if 

Quelqu'un peut-il m'aider s'il vous plaît? J'utilise le serveur SQL 2005.

+0

Des réponses ont-elles été utiles? :) –

Répondre

8

les avoir dans votre requête, comme suit:

SELECT * FROM MyTable 
WHERE [email protected] 
And (Not Condition1 Or col2 = @val2) 
And (Not Condition2 Or col3 = @val3) 

Donc, si Non Non Condition1 (ce qui signifie: Condition1 est vrai) alors col2 (doit) = @ val2 .

(j'ai changé la 2ème logique conditionnelle ET col3 = @ val3, parce que vous aviez répété et col2 = @ val2)

Modifier en réponse à des commentaires: Donnez-moi un exemple des critères pour condition1. Explicit si la syntaxe n'est pas utilisée dans les requêtes dans t-sql. Disons que les «ordres précédents» doivent être inférieurs à 20 pour que le premier critère compte, et. . . le deuxième critère à des questions s'il n'y a pas de prénom. Ce serait:

SELECT * FROM MyTable 
WHERE [email protected] 
And (MyTable.OrderCount > 19 Or col2 = @val2) 
And ((Not MyTable.FirstName Is Null) Or col3 = @val3) 

Ne pensez pas en termes de ceci "ce critère est important si cette situation est vraie". Tous les facteurs importants entrent dans la clause where. Vous devez comprendre l'Or/Et/Non et les ordres d'opération. Cela prend de la pratique pour devenir bon. Si vous devez y réfléchir pendant quelques minutes, ne vous inquiétez pas, il en est de même pour le reste d'entre nous.

+0

Ce n'est pas sargable –

+0

Salut thnx ... Je ne suis pas bon dans la syntaxe sql et cela peut sembler idiot mais comment puis-je utiliser l'instruction if au lieu de ma condition1 dans le sql? SELECT * FROM MyTable where col1 = @ val1 Et (Non Condition1 Ou col2 = @ val2) Et (Non Condition2 Ou col3 = @ val3) – ajithmanmu

+0

Je pense que sargable est l'étape suivante. Nous n'en savons pas assez sur les conditions pour suggérer une stratégie optimale, ou même si l'échelle justifie un tel effort. –

0

Je suppose que vous vouliez avoir deux conditions différentes et des paires col/val, pas la même que dans votre message.

Si « condition » est quelque chose qui existe dans le contexte de la requête (non un facteur externe), alors vous pouvez faire quelque chose comme ceci:

SELECT * FROM MyTable 
WHERE col1 = @val1 
    AND (NOT condition1 OR (condition1 AND col2 = @val2)) 
    AND (NOT condition2 OR (condition2 AND col3 = @val3)) 

Edit: OK, donc le « conditionX ET "est redondant, mais je pense que c'est une bonne idée à des fins de documentation car elle rend explicite l'intention de la construction.

2

En supposant que les conditions peuvent être écrites comme des expressions SQL:

SELECT * FROM MyTable 
WHERE [email protected] AND 
(NOT(condition_1) OR col2 = @val2) AND 
(NOT(condition_2) OR col3 = @val3) 
0

gens homme n'a pas la moindre idée de SQL ces jours ... Incroyable ...

SELECT * 
FROM MyTable 
WHERE [email protected] 
and case when condition1 then col2 = @val2 else 1=1 end 
and case when condition2 then col3 = @val3 else 1=1 end 
+0

Je trouve un CAS dans la clause WHERE qui fonctionne vraiment mal quand je l'ai essayé – gbn

+0

C'est pourquoi vous évaluez au cas par cas, c'est OK pour les petits jeux de données (moins 500k lignes), pour les plus grands conseils que je gère par programmation. Mais pour la rapidité, il aide à résoudre un problème rapide est très utile. – MCoelho

+0

"Les gens n'ont aucune idée de SQL ces temps-ci ... Incroyable ..." Rudeness pas utile. – secretwep

1

Si les colonnes ne sont pas annulable (et don't criticise, try it)

SELECT 
    * 
FROM 
    MyTable 
WHERE 
    col1 = @val1 AND 
    col2 = ISNULL(@val2, col2) AND 
    col3 = ISNULL(@val2, col3) 

Dans le cas contraire (niveau Déclaration recompilation rend acceptable sur SQL Server 2005+)

if condition1 here 
    SELECT * FROM MyTable 
    WHERE [email protected] col2 = @val2 


if condition2 here 
    SELECT * FROM MyTable 
    WHERE [email protected] col3 = @val3 

else 
SELECT * FROM MyTable 
WHERE [email protected] 

Ou utiliser les autres solutions offert