34

这里有一个奇怪的:

我可以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;

全部返回:

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

更新

我正在使用 PHP 执行此操作 - 通过我的 ezSQl 代码并使用PHPLiteAdmin界面

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

更新 2

当我使用 ezSQL 从 PHP 运行代码时,PHP 警告是:

PHP 警告:SQL 逻辑错误或缺少数据库

有没有办法从 PHP 中获取更多信息?这是非常不透明和奇怪的,特别是因为 CLI 中的相同语句工作正常......

更新 3

我拥有的唯一其他可能的线索是 CLI 无法读取我使用 PHP 创建的数据库,反之亦然。我得到:

错误:文件已加密或不是数据库

所以这里肯定有两种 SQlite 口味。(看到这个)仍然,为什么无效的声明?

更新 4

好的,我想我已经找到了罪魁祸首,如果不是原因的话——我用 PHP ezSQL 创建的数据库是 IS NULL 语句失败的数据库。如果我使用 PHP 的 SQLite3 类创建数据库,该语句工作正常,而且,我可以从 CLI 访问数据库,而 ezSQL 创建的数据库给出了file is encrypted错误。

所以我对 ezSQL 代码做了一些研究——我看到它使用 PDO 方法,而不是较新的 SQLite3 类。也许那是什么-我不会再浪费时间了...

无论如何,我找到了我的解决方案,即避开 ezSQL,只使用 PHPs SQLite3 类。

4

6 回答 6

48

a IS banda IS NOT b是 whereabare 表达式的一般形式。

这通常只出现在a IS NULLa IS NOT NULL情况下。还有ISNULLNOTNULL(also NOT NULL) 运算符分别是前面表达式的简写(它们只接受一个操作数)。

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

;如果使用 CLI ,请确保(以前的)语句已以 first 终止。

这些对于否定“空匹配”都是有效的:

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>
于 2011-09-22T18:32:37.170 回答
8

问题可能源于 SQLite 如何处理空列。例如,仅仅因为一列是空的并不意味着它是 NULL。您是否针对“”进行了测试?

SELECT * FROM project WHERE parent_id = ""

该查询可能会返回结果。

于 2011-11-09T00:56:05.777 回答
6

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

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

于 2012-10-05T23:40:34.577 回答
2

这适用于 Firefox 的 SQLite Manager 中的 SQLite:

          select * from foo where not baz is not null

上面的查询返回列 [baz] 为空的行。:-) Yarin,也许它对你有用?(列名前的“not”不是错字)。

此查询也查找 baz 为空的行:

         select * from foo where [baz]  is  null
于 2011-09-22T19:59:37.080 回答
0

如果您正在测试 PK 列 (?) 并且该列被视为 rowid 的同义词,那么没有行的 rowid 为空。

于 2011-09-22T20:08:21.800 回答
-2

尝试 where your_col_name ISNULL wheres ISNULL 不包含空格

于 2014-12-25T06:31:34.617 回答