2010-07-12 7 views
0

je veux faire quelque chose comme ceci:Inline Si états dans SQL

DECLARE @IgnoreNulls = 1; 

SELECT Col1, Col2 
FROM tblSimpleTable 
IF @IgnoreNulls 
BEGIN 
    WHERE Col2 IS NOT NULL 
END 
ORDER BY Col1 DESC; 

L'idée est de, d'une manière très PHP/ASP.NET-ish un peu, filtrer seulement NULLs si l'utilisateur souhaite. Est-ce possible en T-SQL? Ou avons-nous besoin d'un grand bloc IF comme ceci:

IF @IgnoreNulls 
BEGIN 
    SELECT Col1, Col2 
    FROM tblSimpleTable 
    WHERE Col2 IS NOT NULL 
    ORDER BY Col1 DESC; 
END 
ELSE 
BEGIN 
    SELECT Col1, Col2 
    FROM tblSimpleTable 
    ORDER BY Col1 DESC; 
END 

Répondre

4

Vous pouvez le faire de cette façon:

SELECT Col1, Col2 
FROM tblSimpleTable 
WHERE (@IgnoreNulls != 1 OR Col2 IS NOT NULL) 
ORDER BY Col1 DESC 
1

En général (sauf si la table est petite) la meilleure approche est de séparer les cas et faites quelque chose comme vous avez dans votre question.

IF (@IgnoreNulls = 1) 
BEGIN 
    SELECT Col1, Col2 
    FROM tblSimpleTable 
    WHERE Col2 IS NOT NULL 
    ORDER BY Col1 DESC; 
END 
ELSE 
BEGIN 
    SELECT Col1, Col2 
    FROM tblSimpleTable 
    ORDER BY Col1 DESC; 
END 

Ceci est moins susceptible de vous causer des problèmes avec les plans de requête suboptimaux mis en cache.

+0

+1, s'il n'y a qu'un seul paramètre, comme la question semble indiquer, cela ressemble à une bonne Solution. [Conditions de recherche dynamique dans T-SQL - Utilisation des instructions IF] (http://www.sommarskog.se/dyn-search-2005.html#IF) –

3

La modification dynamique des recherches en fonction des paramètres donnés est un sujet compliqué et le fait de le faire d'une manière sur une autre, même avec seulement une très légère différence, peut avoir des implications de performances massives. La clé est d'utiliser un index, ignorer le code compact, ignorer s'inquiéter de répéter le code, vous devez faire un bon plan d'exécution de la requête (utiliser un index).

Lisez ceci et considérez toutes les méthodes. Votre meilleure méthode dépendra de vos paramètres, vos données, votre schéma et votre utilisation réelle:

Dynamic Search Conditions in T-SQL by by Erland Sommarskog

+0

Heureusement, les tables sur lesquelles je travaille sont petites. Le lien fournit cependant un bon aperçu du sujet. –

+0

@ Onion-Knight, apprenez la bonne façon de faire les choses, et faites-le toujours comme ça, et quand vos données grandiront, vous serez en bonne forme. Sinon, vous aurez de mauvaises habitudes et des requêtes lentes lorsque vous avez de grandes tables. –