Ceci est juste une question de curiosité mais je regarde une base de données et extrait des données d'une table avec une requête sur une des colonnes. La colonne a quatre valeurs possibles: null
, 0
, 1
, 2
. Quand j'exécute la requête en tant que:
SELECT * FROM STATUS WHERE STATE != '1' AND STATE != '2';
J'obtiens les mêmes résultats qu'en cours d'exécution:
SELECT * FROM STATUS WHERE STATE = '0';
C'est à dire. les lignes avec une valeur nulle dans la commande top dans la colonne interrogée semblent être omises des résultats, cela se produit-il toujours en SQL?
J'exécute mes commandes via Oracle SQL Developer.
Dans plusieurs langues, NULL est traité différemment: la plupart des gens connaissent la logique à deux valeurs où true
et false
sont les seules valeurs comparables dans les expressions booléennes (même si false est défini comme 0 et vrai comme tout le reste).
En SQL standard, vous devez penser à logique à trois valeurs . NULL n'est pas traité comme une valeur réelle, vous pouvez plutôt l'appeler "inconnu". Ainsi, si la valeur est inconnue, il est difficile de savoir si, dans votre cas, state
est 0, 1 ou autre chose. Donc, NULL != 1
donne encore NULL
.
Ceci conclut que chaque fois que vous filtrez quelque chose qui peut être NULL, vous devez traiter vous-même les valeurs NULL. Notez que la syntaxe est également différente: les valeurs NULL ne peuvent être comparées qu'avec x IS NULL
au lieu de x = NULL
. Voir Wikipedia pour une table de vérité montrant les résultats des opérations logiques.
Oui, c’est normal, vous pouvez peut-être mettre un paramètre de base de données corrigé que
Mais vous pouvez modifier votre code et faire quelque chose comme ça:
SELECT * FROM STATUS WHERE STATE != '1' OR STATE != '2' or STATE is null;
Regardez ceci pour plus d’informations: http://www.w3schools.com/sql/sql_null_values.asp
utilisez NVL
comme suit: SELECT * FROM STATUS WHERE NVL(STATE,'X') != '1' AND NVL(STATE,'X')!= '2';