Expression CASE avec T-SQL

J'utilise:

SELECT CASE SR.[ContainerId] WHEN SR.[ContainerId] IS NULL THEN 0 ELSE 1 END AS [IsSampleReceived] FROM SomeTable SR where SomeCondition 

Cela ne me donne pas le résultat désiré. IsSampleReceived est toujours 1 . Je ne sais pas pourquoi, peut-être qu'il y a quelque chose qui ne va pas dans WHEN SR.[ContainerId] IS NULL .

Il y a deux formats d'utilisation de CASE et vous les mélangez set.

L'expression CASE a deux formats:

L'expression CASE simple compare une expression à un set d'expressions simples pour déterminer le résultat.

L'expression CASE recherchée évalue un set d'expressions booleannes pour déterminer le résultat.

Voir http://msdn.microsoft.com/en-us/library/ms181765.aspx

Au lieu de cela, essayez:

 select case when SR.[ContainerId] is null then 0 else 1 end as [IsSampleReceived] from SomeTable SR where SomeCondition 

Presque! Vous étiez en train de mélanger les deux différentes forms de syntaxe:

 SELECT CASE WHEN SR.[ContainerId] IS NULL THEN 0 ELSE 1 END AS [IsSampleReceived] FROM SomeTable SR where SomeCondition 

Il existe deux types d'instructions CASE: "simple" et "recherché". Dans votre code, vous combinez ces deux types d'instructions, ce qui vous donne des résultats incorrects.

Simple:

 SELECT CASE SR.[ContainerId] WHEN NULL THEN 0 ELSE 1 END AS [IsSampleReceived] FROM SomeTable SR where SomeCondition 

Cherché:

 SELECT CASE WHEN SR.[ContainerId] IS NULL THEN 0 ELSE 1 END AS [IsSampleReceived] FROM SomeTable SR where SomeCondition 

Dans votre requête d'origine, il fait une version simple en comparant la valeur de SR. [ContainerId] à la valeur de SR.[ContainerId] IS NULL . Le résultat de cette comparaison sera toujours faux, donc la condition else a toujours été sélectionnée.