2008-12-09 8 views
8

J'ai une procédure stockée appelée spGetOrders qui accepte quelques paramètres: @startdate et @enddate. Cela interroge une table "Orders". L'une des colonnes de la table s'appelle "ClosedDate". Cette colonne contiendra NULL si une commande n'a pas été fermée ou une valeur de date si elle l'a été. Je voudrais ajouter un paramètre @Closed qui prendra un peu de valeur. Dans un monde simple, je serais capable de le faire ..SQL conditionnel où

select * from orders o 
where o.orderdate between @startdate AND @enddate 
and (if @Closed = 1 then o.ClosedDate IS NULL else o.ClosedDate IS NOT NULL) 

De toute évidence, cela ne va pas travailler .. Je cherche aussi à SQL dynamique qui est mon dernier recours, mais commence à ressembler à la réponse ..

S'il vous plaît aider ..

Répondre

14

Essayez ceci:

select * from orders o 
where o.orderdate between @startdate AND @enddate 
and ((@Closed = 1 And o.ClosedDate IS NULL) Or (@Closed = 0 And o.ClosedDate IS NOT NULL)) 

Soyez prudent lorsque vous mélangez des AND et des OR dans la clause where. Ce faisant, la parenthèse pour contrôler l'ordre d'évaluation est TRÈS importante.

+1

C'est un excellent moyen de résoudre ce problème. Merci pour cette approche! – Noah

2

Déclaration SQL:

SELECT * 
FROM orders 
WHERE orderdate BETWEEN @startdate AND @enddate 
AND (@Closed = 1 OR CLosedDate IS NOT NULL) 
+1

Faites attention à vos ET/OU questions - vous avez besoin entre parenthèses! –

0

Ou ceci:

select * from orders o 
where o.orderdate between @startdate AND @enddate 
and ( (@Closed = 1 AND o.ClosedDate IS NULL) 
    OR (ISNULL(@Closed, 0) <> 1 AND o.ClosedDate IS NOT NULL) 
    ) 

Il semble que vous voulez que tous les ordres entre deux dates qui ont des informations incompatibles Fermer. Les autres suggestions sont probablement aussi bonnes (ou mieux) mais je suis assez sûr que cela fonctionne et est lisible pour moi (la plupart des autres suggestions sont apparues pendant que je tapais).

Bonne chance!

0

Fondamentalement, écrivez-le.

select * from orders o 
where o.orderdate between @startdate AND @enddate 
and ((@Closed = 1 and o.ClosedDate IS NULL) 
    or (@Closed != 1 and o.ClosedDate IS NOT NULL)) 

double, peut être retiré