2010-07-02 6 views
3

J'ai la table SQL suivante:SQL Server - la sélection d'une ligne ne renvoie aucune valeur NULL. Pourquoi?

CREATE TABLE [dbo].[Test](
    [TestID] [int] NOT NULL, 
    [TestNum] [int] NULL, 
    [TestReason] [varchar](50) NULL 
) 

Alors TestNum un INT qui permet NULL valeurs, et je l'ai inséré beaucoup de données dans la table, dont quelques-uns des lignes contiennent une valeur NULL pour TestNum

Si je lance alors la requête suivante

select * 
from Test 
where TestNum != 123 

La requête aboe ne renvoie aucune ligne ayant une valeur NULL. Je m'attendrais à ce qu'il renvoie toutes les lignes SAUF celles qui ont la valeur 123.

Pourquoi est-ce?

Je cours cette requête sur une base de données MS-SQL 2000, importée dans MS SQL 2005. Est-ce que cela a un effet? Ou est ce comportement standard pour toutes les versions de MS SQL Server?

Répondre

12

La valeur NULL représente la valeur "unknown". Pour cette raison, NULL = NULL est faux. Si vous voulez voir des valeurs nulles, vous devez également dire "OR TestNum IS NULL".

+0

+1 pour explication – RedFilter

+2

+1. Ajouter: Ce n'est pas SQL Server qui le fait - c'est la sémantique trinaire SQL standard, la même chose sur tous les serveurs SQL. Donc, personne ne blâme Microsoft pour cela. – TomTom

+0

Thnx Strommy, TomTom et tout le monde. Cela a du sens, même si je ne suis toujours pas d'accord sur une telle mise en œuvre/définition. –

1

Essayez

SELECT * FROM Test WHERE TestNum != 123 OR TestNum IS NULL 

valeurs NULL sont traitées différemment des autres valeurs. Il n'est pas possible de comparer NULL et 123; ils ne sont pas équivalents.

Questions connexes