web-dev-qa-db-fra.com

OÙ - IS NULL ne fonctionne pas dans SQLite?

Voici un étrange:

Je peux filtrer sur NOT NULLS à partir de SQLite, mais pas NULLS:

Cela marche:

SELECT * FROM project WHERE parent_id NOT NULL;

Ceux-ci ne:

SELECT * FROM project WHERE parent_id IS NULL; 
SELECT * FROM project WHERE parent_id ISNULL; 
SELECT * FROM project WHERE parent_id NULL;

Tous reviennent:

Il y a un problème avec la syntaxe de votre requête (la requête n'était pas exécutée Exécutée) ...

METTRE À JOUR:

Je le fais avec PHP via mon code avec ezSQl et en utilisant PHPLiteAdmin interface 

En utilisant la démo PHPLiteAdmin , cette expression fonctionne - alors maintenant je soupçonne un problème de version avec le SQLite de mon PHP? Cela pourrait-il être? Cette expression n'était-elle pas toujours valide?

UPDATE 2:

Lorsque j'exécute le code à partir de PHP à l'aide de ezSQL, l'avertissement PHP est le suivant:

Avertissement PHP: erreur logique SQL ou base de données manquante

Existe-t-il un moyen de tirer davantage d'informations de PHP? C'est opaque et étrange, surtout parce que la même déclaration dans la CLI fonctionne très bien ...

UPDATE 3

Le seul autre indice possible est que les bases de données que je crée avec PHP ne peuvent pas être lues par la CLI, et inversement. Je reçois:

Erreur: le fichier est crypté ou n'est pas une base de données

Il y a donc définitivement deux saveurs SQlite qui se font remarquer. ( Voir ceci ) Pourtant, pourquoi la déclaration invalide ??

UPDATE 4

OK, je pense que j'ai attribué le problème au coupable, sinon à la raison: la base de données que j'ai créée avec PHP ezSQL est celle où l'instruction IS NULL échoue. Si je crée la base de données en utilisant la classe SQLite3 de PHP, l'instruction fonctionne correctement et, de plus, je peux accéder à la base de données à partir de la CLI, alors que la base de données créée par ezSQL donnait l'erreur file is encrypted.

J'ai donc creusé un peu dans le code ezSQL. Au départ, je vois qu'il utilise des méthodes PDO, pas la nouvelle classe SQLite3. Peut-être que c'est quelque chose - je ne vais pas perdre plus de temps là-dessus ...

Dans tous les cas, j'ai trouvé ma solution, qui consiste à éviter ezSQL et à n'utiliser que la classe PHP SQLite3.

30
Yarin

a IS b et a IS NOT b est la forme générale où a et b sont des expressions.

Cela ne se voit généralement que dans les cas a IS NULL et a IS NOT NULL. Il existe également des opérateurs ISNULL et NOTNULL (également NOT NULL) qui sont des raccourcis pour les expressions précédentes, respectivement (ils ne prennent en compte qu'un seul opérande).

Le SQL compris dans les expressions SQLite est traité dans SQLite Query Language: Expressions .

Assurez-vous que les instructions (précédentes) ont été précédées d'un ; si vous utilisez l'interface de ligne de commande.

Ceux-ci sont tous valides pour nier une "correspondance nulle":

expr NOT NULL
expr NOTNULL
expr IS NOT NULL

Ceux-ci sont tous valides pour "correspondre à null":

expr ISNULL
expr IS NULL

Puisque toutes les constructions ci-dessus sont elles-mêmes des expressions, les négations sont également valides (par exemple, NOT (expr NOT NULL) est équivalent à expr IS NULL).

Bonne codage.


La preuve dans le pudding:

SQLite version 3.7.7.1 2011-06-28 17:39:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table x (y int null);
sqlite> select * from x where y isnull;
sqlite> select * from x where y notnull;
sqlite> select * from x where y not null;
sqlite> select * from x where y is null;
sqlite> select * from x where y is not null;
sqlite>
42
user166390

Le problème pourrait provenir de la façon dont SQLite traite les colonnes vides. Par exemple, le fait qu'une colonne soit vide ne signifie pas qu'elle est NULL. Avez-vous testé contre ""?

SELECT * FROM project WHERE parent_id = ""

Cette requête peut renvoyer des résultats.

7
Robert Brisita

Dans Android SQLite, le champ IS NULL ne fonctionne pas non plus.

champ = 'null' fait. Essayez-le dans votre environnement

5
Jose_GD

Cela fonctionne sur SQLite dans SQLite Manager pour Firefox:

          select * from foo where not baz is not null

La requête ci-dessus renvoie des lignes où column [baz] est null. :-) Yarin, peut-être que cela fonctionnera pour vous? (Le 'pas' avant le nom de la colonne n’est pas une faute de frappe).

Cette requête trouve également les lignes où baz est null:

         select * from foo where [baz]  is  null
1
Tim

Si vous testez peut-être la colonne PK (?) Et que la colonne est traitée comme un synonyme pour rowid, aucune ligne n'aura un rowid qui soit null.

0
Tim

essayez où votre_nom_colonne ISNULL wherees ISNULL ne contient pas d'espace

0
Xmobile Vietnam