Подтвердить что ты не робот

WHERE - NULL не работает в SQLite?

Здесь странный:

Я могу фильтровать на 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;

Возврат:

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

UPDATE

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

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

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

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

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

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

ОБНОВЛЕНИЕ 3

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

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

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

ОБНОВЛЕНИЕ 4

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

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

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

4b9b3361

Ответ 1

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 убедитесь, что (предыдущие) операторы были завершены с помощью < <29 > .

Все они действительны для отрицания "нулевого соответствия":

expr NOT NULL
expr NOTNULL
expr IS NOT NULL

Все они действительны для "соответствия 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>

Ответ 2

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

SELECT * FROM project WHERE parent_id = ""

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

Ответ 3

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

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

Ответ 4

Это работает на SQLite в SQLite Manager for Firefox:

          select * from foo where not baz is not null

Запрос выше возвращает строки, где столбец [baz] имеет значение NULL.:-) Ярин, может, это сработает для вас? ( "Не" перед именем столбца не является опечаткой).

Этот запрос также находит строки, где baz имеет значение null:

         select * from foo where [baz]  is  null

Ответ 5

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

Ответ 6

попробуйте, где your_col_name ISNULL weses ISNULL не содержит пробелов