/ / Traitement SQLite de NULL - sqlite, null

Traitement SQLite de NULL - sqlite, null

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 № 1

Vous 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