ГДЕ - NULL не работает в SQLite? - PullRequest
       16

ГДЕ - NULL не работает в SQLite?

30 голосов
/ 22 сентября 2011

Вот странный пример:

Я могу фильтровать по NOT NULLS из SQLite, но не NULLS:

Это работает:

SELECT * FROM project WHERE parent_id NOT NULL;

Это не так:

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

All return:

Возникла проблема с синтаксисом вашего запроса (Запрос не былвыполнено) ...

ОБНОВЛЕНИЕ :

Я делаю это с помощью PHP - через мой код с ezSQl и с использованием PHPLiteAdmin interface

Используя демонстрацию PHPLiteAdmin , это выражение работает, так что теперь я подозреваю, что проблема с версией SQLite моего PHP?Может ли это быть?Разве это выражение не всегда корректно?

ОБНОВЛЕНИЕ 2 :

Когда я запускаю код из PHP с использованием ezSQL, предупреждение PHP:

PHP Предупреждение: ошибка логики SQL или отсутствует база данных

Есть ли способ получить больше информации из PHP?Это поразительно непрозрачно и странно, особенно потому, что одно и то же утверждение в CLI работает нормально ...

ОБНОВЛЕНИЕ 3

Единственная другая возможная подсказка, которую я имею, состоит в том, чтобазы данных, которые я создаю с помощью PHP, не могут быть прочитаны CLI, и наоборот.Я получаю:

Ошибка: файл зашифрован или не является базой данных

Так что здесь определенно есть две разновидности SQlite.( См. Это ) Тем не менее, почему недействительный статус ??

ОБНОВЛЕНИЕ 4

ОК Я думаю, что я отследил проблему до виновного, если не причина - БД, которую я создал с помощью PHP ezSQL, является той, в которой оператор IS NULL терпит неудачу.Если я создаю БД с помощью PHP-класса SQLite3, оператор работает нормально, и, кроме того, я могу получить доступ к БД из CLI, тогда как созданная ezSQL БД выдала ошибку file is encrypted.

Поэтому я немного покопалсяв код ezSQL - Я вижу, что он использует методы PDO, а не новый класс SQLite3.Может быть, это что-то - я не буду тратить впустую больше времени на это ...

В любом случае, я нашел свое решение, которое состоит в том, чтобы держаться подальше от ezSQL, и просто использовать PHPs класс SQLite3.

Ответы [ 6 ]

42 голосов
/ 22 сентября 2011

a IS b и a IS NOT b - это общая форма, где a и b - выражения.

Обычно это наблюдается только в случаях a IS NULL и a IS NOT NULL.Также существуют операторы ISNULL и NOTNULL (также NOT NULL), которые являются сокращенными для предыдущих выражений соответственно (они принимают только один операнд).

SQL, понимаемый в выражениях SQLiteописан в SQLite Query Language: Выражения .

Убедитесь, что (предыдущие) операторы были завершены с ; первым при использовании CLI.

Этовсе действительны для отрицания «нулевого соответствия»:

expr NOT NULL
expr NOTNULL
expr IS NOT NULL

Все они действительны для «совпадения нулевого»:

expr ISNULL
expr IS NULL

Поскольку все вышеприведенные конструкции сами являются выражениями, отрицаниятакже допустимо (например, NOT (expr NOT NULL) эквивалентно expr IS NULL).

Счастливое кодирование.


Доказательство в пудинге:

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>
7 голосов
/ 09 ноября 2011

Проблема может быть связана с тем, как SQLite обрабатывает пустые столбцы.Например, только то, что столбец пустой, не означает, что он равен NULL.Вы проверяли на ""?

SELECT * FROM project WHERE parent_id = ""

Этот запрос может вернуть результаты.

5 голосов
/ 06 октября 2012

В Android SQLite поле IS NULL также не работает.

field = 'null' делает. Попробуйте в своей среде

1 голос
/ 22 сентября 2011

Это работает на SQLite в SQLite Manager для Firefox:

          select * from foo where not baz is not null

Приведенный выше запрос возвращает строки, в которых column [baz] равно нулю. :-) Ярин, может, у тебя это будет работать? («Not» перед именем столбца не является опечаткой).

Этот запрос также находит строки с нулевым значением baz:

         select * from foo where [baz]  is  null
0 голосов
/ 25 декабря 2014

попробуйте, где ваше_кол_ИМЕНЬ ISNULL где ISNULL не содержит пробелов

0 голосов
/ 23 сентября 2011

Если вы проверяете, возможно, столбец PK (?) И столбец обрабатывается как синоним для rowid, то ни одна строка не будет иметь rowid, равный нулю.

...