2010-12-15 5 views
1

J'essaye d'écrire ceci dans une déclaration, comment faire ceci?TSQL conditionnel IS NULL et = opérateur

-- Is there a block for this user? 
SELECT @BlockID = BlockID FROM [Blocks] 
WHERE UserID = @UserID 

-- If not exists, get the default one 
IF @BlockID IS NULL 
SELECT @BlockID = BlockID FROM [Blocks] 
WHERE UserID IS NULL 
+0

Ceci est juste un exemple avec deux cas, j'ai plus de cas 1) Obtenir bloc spécifique utilisateur 2) Si existe pas, réunissez bloc par défaut du groupe 2) Si existe pas, réunissez le bloc par défaut du programme 3) Enfin rien n'existe , obtenez le bloc par défaut. Ci-dessus, je l'ai fait court avec deux cas. –

Répondre

1

coalesce. Il s'étend également à plus de deux cas facilement.

select 
    @BlockID = coalesce(u.BlockID, d.BlockID) 
from 
    Blocks d 
    left join Blocks u on u.UserID = @UserID 
where 
    d.UserID is null 
+0

+1: Le PO n'a pas mentionné les cas supplémentaires initialement, mais votre réponse fonctionnera bien pour une solution généralisée. Agréable! –

+0

Facile à lire et à suivre, que diriez-vous de la performance? Est-ce mieux ou pire que dans mon exemple? –

-1
SET @BlockID = (SELECT BlockID FROM [Blocks] WHERE UserID IS NULL) 
+2

Cela n'obtient que la valeur de blocage par défaut - il n'obtiendra jamais celui associé à @Userid s'il existe. –

+1

@Lukasz: Cela retournerait toujours le bloc par défaut à droite? Whatif, il existe un bloc spécifique à l'utilisateur existe? –

2
SET @BlockID = (SELECT TOP 1 BlockID 
       FROM [Blocks] 
       WHERE UserID IS NULL OR UserID = @UserID 
       ORDER BY CASE WHEN UserID IS NOT NULL THEN 0 ELSE 1 END) 
Questions connexes