Valeurs null dans la requête SQL Server

J'ai une colonne Status dans une table qui a 3 valeurs – 'N / A', 'Single', 'Multiple'. Certaines lignes ont une valeur NULL pour la colonne Status.

J'ai besoin de remonter toutes les lignes dans lesquelles Status n'est pas nul et n'est pas 'N / A'. Fondamentalement, j'ai besoin de toutes les lignes dont le statut est "Single" ou "Multiple".

Je viens juste de lire que NULL est équivalent à 'UNKNOWN'.

Si je dis

 SELECT * FROM t_userstatus WHERE status <> 'N/A' 

Je reçois les résultats (Toutes les lignes contenant "Single" ou "Multiple" seulement).

Ce que je voudrais savoir, c'est que la clause WHERE ci-dessus exclut toujours les lignes ayant des valeurs NULL, est-ce le comportement attendu?

Qu'est-ce qui cause cela pour exclure des lignes nulles même si je ne l'ai pas explicitement spécifié?

Dans ma requête, dois-je explicitement dire que le statut IS NOT NULL ?

Je suis relativement nouveau à la programmation, toute aide est appréciée.

SQL utilise une logique à trois valeurs : true, false et unknown. Toute comparaison à null entraîne des unknown .

Donc null <> 'N/A' évalue à unknown . Puisque unknown n'est pas vrai, cela signifie que la ligne est exclue.

Ce comportement n'est pas normal car N/A ( Single & Multiple aussi) est une string qui n'est pas liée à NULL . Même si la NULL est évaluée à inconnue et ne peut pas returnner, vous devez utiliser explicitement IS NOT NULL .

 SELECT [column_list] FROM t_userstatus WHERE status IS NOT NULL AND status <> 'N/A' 

Je vous recommand également de prendre l'habitude de spécifier une list de colonnes.

Oui, c'est le comportement normal. Une valeur NULL n'a pas de valeur, donc elle ne satisfait pas à une condition WHERE . Si vous souhaitez également inclure des valeurs nulles, vous devez également spécifier IS NOT NULL .

Comme d'autres l'ont dit, null n'est généralement pas comparable. Donc, un status! = 'N / A' revient comme faux quand status est nul.

Mais ce que d'autres n'ont pas encore mentionné, c'est que c'est contrôlé par le paramètre Ansi_nulls. Par défaut, il est activé et les valeurs nulles ne sont pas comparables (comme vous le mentionnez dans la question, le principal derrière ceci est qu'elles sont inconnues, donc il est faux qu'elles ne soient pas nécessairement N / A). Mais vous pouvez utiliser

 SET ANSI_NULLS OFF 

Pour changer ce comportement, dans ce cas, une valeur nulle sera égale à une valeur nulle et ne sera égale à rien d'autre. Il y a plus de détails sur MSDN ici .

Un peu non-évident, SQL a trois logiques évaluées (vrai / faux / inconnu). Toute comparaison directe avec NULL entraînera la valeur unknown qui dans la clause WHERE est considérée comme non vraie. Votre condition

 WHERE status <> 'N/A' 

en d'autres termes, ne correspondra jamais à une valeur nulle car NULL n'est jamais égal à rien.

La seule façon de faire correspondre une NULL aide d'une comparaison consiste à utiliser les opérations null spéciales IS NULL ou IS NOT NULL .

En passant, la vie n'est naturellement jamais aussi simple.