web-dev-qa-db-fra.com

Le SQL n’affiche-t-il pas les valeurs nulles sur une requête non égale?

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.

33
Alexei Blue

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.

29
Alex

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

9
GregM

utilisez NVL comme suit: SELECT * FROM STATUS WHERE NVL(STATE,'X') != '1' AND NVL(STATE,'X')!= '2';

1
Madam Zu Zu