Pourquoi MYSQL DANS le mot-ne pas considérer les valeurs NULL
Je suis l'aide de la requête suivante:
select count(*) from Table1 where CurrentDateTime>'2012-05-28 15:34:02.403504' and Error not in ('Timeout','Connection Error');
Étonnamment, cette déclaration ne comprend pas les lignes ayant une valeur d'Erreur NULLE.Mon intention est de filtrer uniquement les lignes avec la valeur d'Erreur comme 'Timeout' (ou les) 'Erreur de Connexion'. J'ai besoin de donner une condition supplémentaire( OU une Erreur est NULLE) pour récupérer le résultat correct.
Pourquoi est-MYSQL filtrer les résultats avec les valeurs NULL?
Je pensais que DANS le mot serait retourner un résultat booléen (1/0) et maintenant, je comprends que certains mots-clés MYSQL ne marche pas, le retour des valeurs booléennes,il peut retourner NULL....mais Pourquoi est-il traiter NULL spécial?
Vous devez vous connecter pour publier un commentaire.
Ce :
est sémantiquement équivalent à:
Règles à peu près nulle comparaison s'applique à DE trop. Donc, si la valeur de l'Erreur est NULLE, la base de données ne peut pas faire l'expression véritable.
À résoudre, vous pourriez faire ceci:
Ou mieux encore:
Ou mieux encore:
OR
n'a pas de court-circuit, l'AFFAIRE peut en quelque sorte court-circuit de votre requêtePeut-être un exemple concret pourrait illustrer pourquoi
NULL NOT IN expression
ne retourne rien:Compte tenu des données: http://www.sqlfiddle.com/#!2/0d5da/11
Et vous faire de cette expression:
Qui va afficher "salut" seulement.
Le PAS est traduit comme:
NULL <> 'bruce'
ne peut être déterminée, même pas vrai, même pas fauxNULL <> 'banner'
ne peut être déterminée, même pas vrai même pas fauxDe sorte que la valeur null expression, effectivement résolu: de
En fait, si votre SGBDR prend en charge booléenne sur SÉLECTIONNER(par exemple, MySQL, Postgresql), vous pouvez voir pourquoi: http://www.sqlfiddle.com/#!2/d41d8/828
Qui retourne null.
Cette méthode retourne null trop:
Étant donné que vous êtes en utilisant
NOT IN
, qui est essentiellement un ET de l'expression.Résultats à NULL. C'est comme si vous faites un: http://www.sqlfiddle.com/#!2/0d5da/12
Rien n'est retourné
IN
/NOT IN
, est sémantiquement équivalent àV = 'Alpha' OR V = 'Beta'
,V <> 'Alpha' AND V <> 'Beta'
respectivement, donc les règles à propos de la valeur NULL s'applique toujoursNULL <> 'Bruce'
décide de Système.DBNull, ce n'est pas 1 ni 0. Ou peut-être que je suis à l'aide de Postgres. Je pense que cela dépend de la couche d'accès aux données mécanisme de trop. Je préférerais avoir un DAL qui montre la même chose que ce que je peux voir sur le SGBD lui-mêmecase when
raccourci, c'est le génieParce que null n'est pas défini null n'est pas égal à null. Vous devez toujours traiter explicitement la valeur null.
IN
retourneNULL
si l'expression sur le côté gauche estNULL
. Afin d'obtenir leNULL
valeurs, que vous avez à faire:IN
renvoie une trivalentBOOLEAN
(qui n'accepteNULL
comme une valeur).NOT IN
renvoie la trivalent négation deIN
, et de négation deNULL
est unNULL
.Imaginer que nous avons un tableau avec tous les numéros de
1
à1,000,000
dansid
et cette requête:ou son équivalent:
Le prédicat retourne
TRUE
pour1
et2
etNULL
pour toutes les autres valeurs, donc1
et2
sont retournés.Dans son ci-contre:
ou
le prédicat retourne
FALSE
pour1
et2
etNULL
pour toutes les autres valeurs, donc, rien n'est retourné.Noter que la négation booléenne pas seulement les changements de l'opérateur (
=
à<>
), mais le quantificateur trop (ANY
àALL
).@Michael Buen ' s réponse était la bonne réponse pour mon cas, mais permettez-moi de simplifier pourquoi.
@Michael a dit dans son post:
Et dans [1] j'ai trouvé cette phrase qui confirme son plus important pour comprendre le pourquoi DE l'échec avec la valeur NULL. Dans le cahier des charges ("caractéristiques") dans [1], vous aurez à: "Si l'un ou les deux arguments sont NULL, le résultat de la comparaison est NULLE, sauf pour les NULS-safe <=> l'égalité opérateur de comparaison."
Donc oui, la chose est que, malheureusement, Mysql se perd dans un tel cas. Je pense que Mysql concepteurs ne devais pas faire cela, parce que quand je compare les 2 NULL, Mysql DEVRAIT être en mesure de voir qu'ils sont DIFFÉRENTS, et pas simplement jeter erronée des résultats. Par exemple, j'ai fait:
puis il jette des résultats VIDES. MAIS. Si je ne
il montre le bon résultat. Donc, lorsque vous utilisez l'opérateur, vous devez filtrer les valeurs NULL. Ce n'est pas un comportement souhaité pour moi en tant qu'utilisateur, mais c'est documenté dans le cahier des charges [1]. Je pense que les langues et la technologie devraient être plus simples, dans le sens que vous devriez être en mesure de DÉDUIRE sans avoir besoin de lire les specs. Et vraiment, 2 est DIFFÉRENT de NULL, je dois être l'un en charge de contrôler et de prendre soin des erreurs d'un niveau d'abstraction plus élevé, mais MySQL DEVRAIT jeter un résultat FAUX lorsque l'on compare les valeurs NULL avec une valeur spécifique.
Références pour les specs: [1] http://dev.mysql.com/doc/refman/5.6/en/type-conversion.html
Désolé de poster deux fois dans le même forum, mais je veux illustrent un autre exemple:
Je suis d'accord avec @Wagner Bianchi dans [2] dans ce forum, quand il dit:
<< C'est très astuce lorsque vous traitez avec des données et les sous-requêtes>>
En outre, cela ne devrait PAS être le problème, je pense que Mysql, les designers sont dans l'erreur quand ils ont pris cette décision documenté dans [1]. La conception doit être différent. Laissez-moi vous expliquer: Vous savez que lorsque l'on compare les
MAIS si dans la liste, vous avez au moins un NUL, alors:
Nous ne sommes pas les premiers à obtenir confus par ce. Voir [2]
Références:
[1] http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_in
[2] http://blog.9minutesnooze.com/sql-not-in-subquery-null/comment-page-1/#comment-86954