web-dev-qa-db-fra.com

Pas égal <>! = Opérateur sur NULL

Quelqu'un pourrait-il s'il vous plaît expliquer le comportement suivant dans SQL?

SELECT * FROM MyTable WHERE MyColumn != NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn <> NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn IS NOT NULL (568 Results)
252
Maxim Gershkovich

<> est la norme SQL-92; != est son équivalent. Les deux évaluent des valeurs, qui NULL n'est pas - NULL est un espace réservé pour indiquer l'absence de valeur.

C'est pourquoi vous ne pouvez utiliser que IS NULL/IS NOT NULL comme prédicats pour de telles situations.

Ce comportement n'est pas spécifique à SQL Server. Tous les dialectes SQL conformes aux normes fonctionnent de la même manière.

Note: Pour comparer si votre valeur n'est pas nulle, vous utilisez IS NOT NULL, alors que pour comparer avec non null valeur, vous utilisez <> 'YOUR_VALUE'. Je ne peux pas dire si ma valeur est égale ou non à NULL, mais je peux dire si ma valeur est NULL ou NOT NULL. Je peux comparer si ma valeur est autre que NULL.

287
OMG Ponies

NULL n'a pas de valeur et ne peut donc pas être comparé à l'aide des opérateurs de valeurs scalaires.

En d'autres termes, aucune valeur ne peut jamais être égale à (ou différente de) NULL car NULL n'a aucune valeur.

Par conséquent, SQL a des prédicats IS NULL et IS NOT NULL spéciaux pour traiter avec NULL.

82
Barry Brown

Notez que ce comportement est le comportement par défaut (ANSI).

Si vous:

 SET ANSI_NULLS OFF

http://msdn.Microsoft.com/en-us/library/ms188048.aspx

Vous obtiendrez des résultats différents.

SET ANSI_NULLS OFF sera apparemment parti dans le futur ...

26
Cade Roux

Le seul test pour NULL est IS NULL ou IS NOT NULL. Tester l'égalité est absurde car, par définition, on ne sait pas quelle est la valeur.

Voici un article de Wikipédia à lire:

https://en.wikipedia.org/wiki/Null_ (SQL)

7
dkretz

En SQL, tout ce que vous évaluez/calculez avec NULL résulte en UNKNOWN

C'est pourquoi SELECT * FROM MyTable WHERE MyColumn != NULL ou SELECT * FROM MyTable WHERE MyColumn <> NULL vous donne 0 résultats.

Pour fournir une vérification des valeurs NULL, la fonction isNull est fournie.

De plus, vous pouvez utiliser l'opérateur IS comme vous l'avez utilisé dans la troisième requête.

J'espère que cela t'aides.

7
Mahendra Liya

Nous utilisons

SELECT * FROM MyTable WHERE ISNULL(MyColumn, ' ') = ' ';

pour renvoyer toutes les lignes où MyColumn est NULL ou toutes les lignes où MyColumn est une chaîne vide. Pour de nombreux "utilisateurs finaux", le problème des chaînes NULL et des chaînes vides constitue une distinction sans nécessité ni confusion.

6
Jeff Mergler

Je ne vois tout simplement pas la raison fonctionnelle et transparente pour laquelle les valeurs NULL ne soient pas comparables à d'autres valeurs ou à d'autres NULL, car nous pouvons clairement les comparer et dire qu'elles sont identiques ou non dans notre contexte. C'est marrant. Juste à cause de certaines conclusions logiques et de la cohérence, nous devons nous en préoccuper constamment. Ce n'est pas fonctionnel, rendez-le plus fonctionnel et laissez le soin aux philosophes et aux scientifiques de conclure si c'est cohérent ou non et si cela tient à la "logique universelle". :) Quelqu'un dira peut-être que c'est à cause d'index ou autre chose, je doute que ces éléments ne puissent pas supporter les valeurs nulles identiques aux valeurs. C’est la même chose que de comparer deux verres vides, un verre de vigne et un verre de bière, nous ne comparons pas les types d’objets, mais les valeurs qu’ils contiennent, identiques à celles que vous pouvez comparer int et varchar, avec null c’est encore plus facile, ce n’est rien et quoi deux néant ont en commun, ils sont les mêmes, clairement comparables par moi et par tous les autres qui écrivent SQL, parce que nous rompons constamment cette logique en les comparant de manière étrange en raison de certaines normes ANSI. Pourquoi ne pas utiliser la puissance de l'ordinateur pour le faire pour nous et je doute que cela ralentisse les choses si tout ce qui est lié est construit dans cet esprit. "Ce n'est pas nul, ce n'est rien", ce n'est pas Apple c'est apfel, allez ... Fonctionnellement, c'est votre ami et il y a aussi une logique ici. En fin de compte, seule la fonctionnalité compte, et l'utilisation de valeurs NULL de cette manière apporte plus ou moins de fonctionnalité et de facilité d'utilisation. Est-ce plus utile?

Considérons ce code:

SELECT CASE WHEN NOT (1 = null or (1 is null and null is null)) THEN 1 ELSE 0 end

Combien d'entre vous savent ce que ce code retournera? Avec ou sans NOT, il retourne 0. Pour moi, ce n'est pas fonctionnel et c'est déroutant. En c #, tout se passe comme il se doit, les opérations de comparaison renvoient une valeur, logiquement, cela produit aussi de la valeur, car sinon, il n'y a rien à comparer (sauf. Rien :)). Ils ont juste "dit": tout ce qui est comparé à null "renvoie" 0 et cela crée de nombreuses solutions de contournement et maux de tête.

C'est le code qui m'a amené ici:

where a != b OR (a is null and b IS not null) OR (a IS not null and b IS null)

J'ai juste besoin de comparer si deux champs (dans où) ont des valeurs différentes, je pourrais utiliser function, mais ...

4
Hrvoje Batrnek

NULL Ne peut être comparé à aucune valeur à l'aide des opérateurs de comparaison. NULL = NULL est faux. Null n'est pas une valeur. L'opérateur IS est spécialement conçu pour gérer les comparaisons NULL.

4
Vincent Ramdhanie

Ancienne question, mais ce qui suit pourrait offrir plus de détails.

null ne représente aucune valeur ou une valeur inconnue. Il ne spécifie pas pourquoi il n’ya pas de valeur, ce qui peut créer une ambiguïté.

Supposons que vous exécutiez une requête comme ceci:

SELECT *
FROM orders
WHERE delivered=ordered;

c'est-à-dire que vous recherchez des lignes où les dates ordered et delivered sont identiques.

À quoi faut-il s'attendre quand une ou les deux colonnes sont nulles?

Parce qu'au moins une des dates est inconnue, vous ne pouvez pas vous attendre à dire que les 2 dates sont les mêmes. C’est également le cas lorsque les dates les deux sont inconnues: comment peuvent-elles être identiques si nous ne savons même pas ce qu’elles sont?

Pour cette raison, toute expression traitant null comme une valeur doit échouer. Dans ce cas, cela ne correspondra pas. C'est également le cas si vous essayez ce qui suit:

SELECT *
FROM orders
WHERE delivered<>ordered;

Encore une fois, comment pouvons-nous dire que deux valeurs sont pas identiques si nous ne savons pas ce qu’elles sont.

SQL a un test spécifique pour les valeurs manquantes:

IS NULL

Spécifiquement, ce ne sont pas des valeurs comparant, mais plutôt des valeurs manquantes.

Enfin, en ce qui concerne l'opérateur !=, autant que je sache, il ne figure pas dans aucune des normes, mais il est très largement pris en charge. Il a été ajouté pour que les programmeurs de certaines langues se sentent plus à l'aise. Franchement, si un programmeur a du mal à se souvenir de la langue qu’il utilise, il est mal parti.

1
Manngo

NULL n'est rien ... c'est inconnu. NULL ne signifie rien. C’est pourquoi vous devez utiliser la phrase magique IS NULL au lieu de = NULL dans vos requêtes SQL.

Vous pouvez vous référer à ceci: http://weblogs.sqlteam.com/markc/archive/2009/06/08/60929.aspx

0
Shadow