pourquoi est nul de ne pas égal à null false
J'ai été la lecture de cet article:
Obtenir null == null en SQL
Et le consensus est que lorsque vous essayez de tester l'égalité entre deux (nullable) les colonnes sql, la bonne approche est:
where ((A=B) OR (A IS NULL AND B IS NULL))
Lorsque A et B sont NULS, (A=B) renvoie toujours FAUX, car NULLE n'est pas égal à NULL. C'est pourquoi la vérification supplémentaire est nécessaire.
Ce sujet lors de l'essai d'inégalités? La suite de la discussion ci-dessus, il m'a fait penser que pour tester les inégalités j'aurais besoin de faire quelque chose comme:
WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))
Cependant, j'ai remarqué que ce n'est pas nécessaire (au moins pas sur informix 11.5), et que je peux le faire:
where (A<>B)
Si A et B sont NULS, ce renvoie la valeur FALSE. Si la valeur NULL n'est pas égal à NULL, alors il faut bien que ce retour VRAI?
MODIFIER
Ce sont toutes de bonnes réponses, mais je pense que ma question est un peu vague. Permettez-moi de reformuler:
Étant donné que A ou B peut être NULLE, est-ce suffisant pour vérifier leur inégalité de traitement avec les
where (A<>B)
Ou ai-je besoin explicitement vérifier comme ceci:
WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))
Reportez-vous à cette fil pour la réponse à cette question.
- En bref,
anything = NULL
est NUL (ni vrai ni faux). etanything <> NULL
est NULL.
Vous devez vous connecter pour publier un commentaire.
relationnel expressions impliquant NULL réellement le rendement NULL encore
modifier
ici,
<>
se tient pour arbitraire opérateur binaire,NULL
est l'espace réservé SQL, etvalue
est n'importe quelle valeur (NULL
est pas une valeur):NULL <> value
->NULL
NULL <> NULL
->NULL
la logique est:
NULL
signifie "pas de valeur" ou "valeur inconnue", et donc toute comparaison avec n'importe quel réel valeur n'a pas de sens.est
X = 42
vrai, faux, ou inconnu, étant donné que vous ne savez pas quelle valeur (si tout)X
détient? SQL dit qu'il est inconnu. estX = Y
vrai, faux, ou inconnu, étant donné que les deux sont inconnus? SQL, dit le résultat est inconnu. et il le dit pour n'importe quel binaire opération relationnelle, ce qui est logique (même si les valeurs Null dans le modèle n'est pas en premier lieu).SQL fournit également deux unaire postfix opérateurs,
IS NULL
etIS NOT NULL
, ces renvoient TRUE ou FALSE en fonction de leur opérande.NULL IS NULL
->TRUE
NULL IS NOT NULL
->FALSE
select * from A where A.xxx <> null
- je obtenir un jeu de résultats vide. Cependant, si j'écrisselect * from A where null
c'est une erreur de syntaxe. Si quelque chose ne fonctionne pas pour moi avec la valeur "<> null => null" explication...pouvez-vous m'aider sur la façon de penser "le droit" de façon à ce propos?value <> null => false
etvalue = null => false
trop? Cela permettrait d'éviter le type d'erreur dont je parle. En outre, comme cela on peut raisonner sur le sens de quelque chose commevalue <> null AND 1=1
, alors que lesnull AND 1=1
nouveau serait syntaxiquement étrange... comme je l'ai dit, je suis juste essayer d'envelopper ma tête autour de cela.foo OP NULL
est permis parce que SQL est cassé.foo != NULL
etfoo = NULL
sont fausses. ils sont inconnu.Parce que le comportement suit établi ternaires de la logique où NULL est considéré comme une valeur inconnue.
Si vous pensez à la valeur NULL comme inconnu, il devient beaucoup plus intuitive:
Est
unknown a
égal àunknown b
? Il n'y a aucun moyen de savoir, donc:unknown
.Toutes les comparaisons impliquant
null
ne sont pas définis, et la valeur false. Cette idée, qui est ce qui empêchenull
être évaluée comme équivalente ànull
, empêche égalementnull
être évalué comme n'étant PAS équivalent ànull
.null
s autres queis
retournera false sur une DB qui suit le standard SQL.IS NULL
etIS NOT NULL
tests, produit NULL.null
s renvoie toujours null" est plus significatif (et encore moins utile) que "une comparaison impliquant une ou plusieursnull
s toujours la valeur false". Vous devez faire la prochaine étape de "parce qu'il prend la valeur null, n'est pas true, faire de est-pour l'essentiel,--faux". Veuillez expliquer en quoi c'est plus clair.v_b:=null=null; if (v_b = false) then /* not reached */ elsif (v_b is null) then /* reached */ end if;
donc, même sinull = null
n'est pas vrai, il n'est toujours pas faux non plus.elsif
bloc est ce qui est évalué. Vous pouvez inverser la comparaison (if (v_b = true)...
) et la relative chemins de code serait le même; laelseif
bloc est ce qui va être évalué.if
direction de est uniquement suivi si le résultat esttrue
, de sorte qu'il regarde comme le résultat est faux, mais ce n'est certainement pas faux.null
(voir commentaire ci-dessus), mais la pratique effet, c'est que la comparaison elle-même évalue àfalse
(en d'autres termes, il ne sera jamais true). Vous êtes en instaurant une autre couche à l'aide de PL/SQL, ce n'est pas SQL (c'est un langage procédural qui est conçu pour interagir avec SQL).La réponse courte est... les valeurs Null sont bizarre, ils n'ont pas vraiment de se comporter comme vous le souhaitez.
Voici un excellent article sur la façon dont les valeurs Null dans SQL. Je pense que ça va aider à améliorer votre compréhension du sujet. Je pense que les sections sur la gestion des valeurs null dans les expressions sera particulièrement utile pour vous.
http://www.oracle.com/technology/oramag/oracle/05-jul/o45sql.html
La valeur par défaut (ANSI) le comportement de la valeur null dans une expression entraînera une valeur null (il y a assez d'autres réponses avec le cas de l').
Il existe cependant quelques cas limites et mises en garde que je place lorsque vous traitez avec MS Sql Server qui ne sont pas listés.
Il est possible en SQL Serveur à remplacer l'expression logique à propos de l'Null = Null test, à l'aide du SET ANSI_NULLS, ce qui vous donnera ensuite l'égalité entre les valeurs null - ce n'est pas recommandé de se déplacer, mais n'existe pas.
Ici est une solution Rapide
ISNULL(A,0)=ISNULL(B,0)
0 peut être changé pour quelque chose qui ne peut jamais arriver dans vos données
Est pas une égale inconnu b? Il n'y a aucun moyen de savoir, donc: inconnu."
La question était : pourquoi la comparaison du rendement FAUX ?
Donné logique tri-valuée, en effet, il serait judicieux pour la comparaison de rendement INCONNU (pas FAUX). Mais le langage SQL rendement FAUX, et il n'est pas INCONNU.
L'un des myriades de perversities dans le langage SQL.
En outre, les éléments suivants doivent être pris en compte :
Si "inconnu" est une valeur logique dans ternaires de la logique, elle devrait être le cas, une comparaison d'égalité entre deux valeurs logiques que les deux se trouvent être (la valeur de) "inconnu", alors que la comparaison devrait rendement VRAI.
Si la valeur logique est elle-même inconnu, alors évidemment ce ne peut être représentée par mettre la valeur "inconnu", parce que cela impliquerait que la valeur logique est connu pour être "inconnu"). C'est, une.o., comment la théorie relationnelle prouve que la mise en œuvre de 3 à valeur logique pose l'exigence d'un 4-valeur logique, qu'un 4 évalués logique conduit à la nécessité pour un enfant de 5-évalué la logique, etc. etc. ad infinitum.