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.
Ответы
Ответ 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 не содержит пробелов