2010-05-11 5 views
2

Je dois vérifier trois conditions:changer cas où la clause

if @filter = 1 
{ 
    select * from employeestable where rating is not null 
} 
else if @filter = 2 
{ 
    select * from employeestable where rating is null 
} 
else 
{ 
    select * from employeestable 
} 

Ce que je dois faire en utilisant une déclaration de cas. maintenant j'ai plus de 30 lignes de requête, si j'utilise cas, je peux réduire mon code jusqu'à 70%
S'il vous plaît laissez-moi maintenant comment puis-je faire cela.

Répondre

6

Que pensez-vous de cela?

WHERE (@filter = 1 AND rating IS NOT NULL) 
OR  (@filter = 2 AND rating IS NULL) 
OR  (@filter <> 1 AND @filter <> 2) 
0

Vous pouvez tirer parti de la logique de bits.

Les données de test

DECLARE @employeestable TABLE (rating INTEGER) 
INSERT INTO @employeestable 
SELECT NULL 
UNION ALL SELECT 99 

DECLARE @filter INTEGER 
SET @filter = 3 

Déclaration SQL

SELECT * 
FROM (
      SELECT Filter = CASE WHEN rating IS NULL THEN 2 ELSE 1 END 
        , * 
      FROM @employeestable 
     ) et 
WHERE et.Filter & @filter = et.filter 
2

réduisant votre code de 70% est agréable, mais en utilisant un index est la seule façon de faire la requête de bons résultats. Lire cet article: Dynamic Search Conditions in T-SQL by Erland Sommarskog,. Il existe de nombreuses façons d'avoir des conditions de recherche dynamiques, chacune avec ses propres compromis de performance subtils. Si vous craignez de répéter plusieurs fois la majeure partie de la requête, pensez à la remplacer par une vue.

+0

+1 allait dire la même chose. Moins de code ne signifie pas nécessairement un code plus performant. – AdaTheDev

+1

Lorsque vous compromettez les performances pour du code SQL pur, vous pouvez souvent écraser les performances plus que vous ne pouvez l'imaginer. –