2009-11-04 3 views
0

lorsque les paramètres facultatifs sont NULL ou vide comment puis-je ignorer cette condition? par exemple.stocké proc retourne toutes les lignes lorsque les paramètres sont NULL

declare @color nvarchar(50) 
declare @time datetime 

set @color = null 

select * 
    from apples 
where apple.color = @color 
    and apple.time = @time 

si @color ou @time est nul, je voudrais ignorer cette condition.

Répondre

0

Essayez ceci:

select * 
from apples 
where 1 = Case 
      When @color is null then 1 
      else 
      Case 
       When apple.color = @color then 1 
       else 0 
      end 
      end 
    and 1 = Case 
      When @time is null then 1 
      else 
       Case 
       When apple.time = @time Then 1 
       else 0 
       end 
      end 
+0

grâce, il a travaillé – sam

2

Syntaxe dépend de vos SGBDR exactes, mais pour MySQL:

SELECT * 
FROM apples 
WHERE apple.color = IFNULL(@color, apple.color) 
AND apple.time = IFNULL(@time, apple.time) 

et ainsi de suite pour d'autres attributs.

5
SELECT * 
FROM apples 
WHERE (@color IS NULL OR apples.color = @color) 
    AND (@time IS NULL OR apples.time = @time) 
1

Vous pouvez simplement ajouter "ou @param est nul" à chaque condition.

select * from apples where (apple.color = @color or @color is null) and (apple.time = @time or @time is null) 

Une autre solution consiste à générer l'instruction SQL dynamiquement.

+0

Merci pour la réponse la génération SQL dynamique n'est pas la préférence DBA :( – sam

+1

@ Sam:. Obtenir votre DBA pour comparer les plans d'exécution pour le 'OU EST NULL construire (scan de table) et la SQL dynamique (utilise des index) – onedaywhen

+0

J'aime vraiment cette méthode, bonne idée! –

4

Pour le lecteur humain, quelque chose comme cela semble être préféré:

SELECT * 
    FROM apples 
WHERE apple.color = COALESCE(@color, apple.color) 
     AND apple.time = COALESCE(@time, apple.time); 

et je comprends que certains optimiseurs gèrent très bien. Malheureusement, ce n'est pas l'un des de SQL Server les: ce qui précède entraînera une analyse de table, comme des variations de volonté sur le thème :(

Tony Rogerson SQL Server MVP a some good analysis sur cette question et a conclu:

Le seule façon dans SQL Server ... pour obtenir une solution efficace, évolutive et performante est d'utiliser soit une tonne de IF ELSE contrôle de blocs de flux (un par combinaison paramètre) ou utiliser SQL dynamique .

Donc, la réponse dépend plutôt de savoir si vous écrivez un code facile à comprendre, à maintenir et à transférer vers d'autres plateformes SQL dans le futur ou qui fonctionne bien sur un optimiseur aujourd'hui.

0
Select * from apples where apple.color like (ISNULL(@color,'%')) 
+2

Pouvez-vous expliquer cela? –

Questions connexes