J'ai une requête SQL comme
SELECT * FROM tableName WHERE colName != "contents"
maintenant, contrairement à ce que je pensais, cela ne semble pas correspondre à un nom de colonne dont le contenu est "NULL". Regarder comment SQLite gère les NULL et spécialement cette condition "null OR true" is true
étant vrai pour SqlLite, je pensais que ma requête suffirait pour sélectionner les lignes avec NULL
pour colName
. Je dois avoir mal compris. Quelqu'un peut-il faire la lumière sur ce pour moi? Je peux juste utiliser
SELECT * FROM tableName WHERE (colName != "contents" OR colName IS NULL)
mais je ne pensais pas que je devrais le faire.
Merci
Réponses:
5 pour la réponse № 1Vous pouvez contourner ce problème en utilisant IS NOT
plutôt que !=
. Si vous regardez la section opérateurs de ce document tu verras:
Les opérateurs IS et IS NOT fonctionnent comme = et!= sauf lorsque l'un ou les deux opérandes sont NULL. Dans ce cas, si les deux opérandes sont NULL, l'opérateur IS évalue à 1 (true) et l'opérateur IS NOT évalue à 0 (false). Si l'un des opérandes est NULL et que l'autre ne l'est pas, l'opérateur IS est évalué à 0 (false) et l'opérateur IS NOT est 1 (true). Il n'est pas possible qu'une expression IS ou IS NOT soit évaluée à NULL. Les opérateurs IS et IS n'ont pas la même priorité que =.
Je l'ai testé moi-même:
sqlite> create table temp( dataColumn, nullColumn );
sqlite> insert into temp( dataColumn, nullColumn ) values ( "test", NULL );
sqlite> select * from temp where nullColumn != "test";
sqlite> select * from temp where nullColumn IS NOT "test";
test|
sqlite> select * from temp where dataColumn IS NOT "test";
sqlite>
De jouer un peu plus, il semble que le !=
opérateur volonté évaluer à NULL
quand vous l'utilisez pour comparer quelque chose avec NULL
:
sqlite> select ( "contents" != NULL );
sqlite> select ( "contents" == NULL );
sqlite> select ( "contents" IS NULL );
0
sqlite> select ( "contents" IS NOT NULL );
1
C’est probablement pour cette raison que vous n’obtenez pas le comportement que vous attendez - vous dites effectivement WHERE NULL != "contents"
qui évalue à NULL et ne satisfait pas la clause WHERE