WHERE - 在SQLite中没有工作的NULL吗?

Yar*_*rin 32 sqlite ezsql

这是一个奇怪的:

我可以NOT NULLS从SQLite 过滤,但不能NULLS:

这有效:

SELECT * FROM project WHERE parent_id NOT NULL;
Run Code Online (Sandbox Code Playgroud)

这些不是:

SELECT * FROM project WHERE parent_id IS NULL; 
SELECT * FROM project WHERE parent_id ISNULL; 
SELECT * FROM project WHERE parent_id NULL;
Run Code Online (Sandbox Code Playgroud)

全部回报:

您的查询语法存在问题(查询未执行)...

更新:

我正在使用PHP-通过我的代码使用ezSQl并使用PHPLiteAdmin接口

使用PHPLiteAdmin演示,这个表达式有效 - 所以现在我怀疑我的PHP的SQLite存在版本问题?可能是吗?这个表达式总是有效吗?

更新2:

当我使用ezSQL从PHP运行代码时,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类.

小智 45

a IS ba IS NOT b是一般形式,其中ab是表达式.

这通常只在a IS NULLa IS NOT NULL案例中看到.还有(ISNULL和)运算符分别是前面表达式的简写(它们只占用一个操作数).NOTNULLNOT NULL

SQLite表达式中理解的SQL包含在SQLite查询语言:表达式中.

;如果使用CLI ,请确保(先前)语句已使用first 语句终止.

这些都有效否定"空匹配":

expr NOT NULL
expr NOTNULL
expr IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

这些都有效"匹配null":

expr ISNULL
expr IS NULL
Run Code Online (Sandbox Code Playgroud)

由于所有上述构造本身都是表达式,因此否定也是有效的(例如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>
Run Code Online (Sandbox Code Playgroud)


Rob*_*ita 8

问题可能源于SQLite如何处理空列.例如,因为列是空的并不意味着它是NULL.你有没有测试过""?

SELECT * FROM project WHERE parent_id = ""
Run Code Online (Sandbox Code Playgroud)

该查询可能会返回结果.


Jos*_*_GD 5

在Android SQLite中,字段IS NULL也不起作用.

field ='null'的确如此.在您的环境中尝试一下