WHERE-NULL在SQLite中不起作用吗?

WHERE-NULL在SQLite中不起作用吗?,sqlite,ezsql,Sqlite,Ezsql,这里有一个奇怪的例子: 我可以从SQLite中过滤非空值,但不能过滤空值: 这是有效的: 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; 这些没有: SELECT * F

这里有一个奇怪的例子:

我可以从SQLite中过滤
非空值,但不能过滤
空值

这是有效的:

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;
这些没有:

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代码和接口

使用,这个表达式可以工作-所以现在我怀疑我的PHP的SQLite有版本问题?可能是这样吗?这句话不总是正确的吗

更新2

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

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

有没有办法从PHP中获取更多信息?这是令人发狂的不透明和怪异,特别是因为CLI中的同一语句可以很好地工作

更新3

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

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

所以这里肯定有两种SQlite风格的对头。()不过,为什么是无效状态

更新4

好的,我想我已经找到了问题的根源,如果不是原因的话——我用PHP ezSQL创建的DB就是is NULL语句失败的地方。如果我使用PHP的SQLite3类创建DB,该语句工作正常,而且我可以从CLI访问DB,而ezSQL创建的DB给出的
文件是加密的
错误

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


无论如何,我已经找到了解决方案,那就是避开ezSQL,只使用PHPs SQLite3类。

a是b
a不是b
a
b
是表达式的一般形式

这通常仅在
a为空
a不为空
的情况下出现。还有
ISNULL
NOTNULL
(也有
NOTNULL
)运算符,它们分别是前面表达式的短指针(它们只接受一个操作数)

SQLite表达式中理解的SQL将在中介绍

确保(以前的)语句以
结尾首先

这些都可用于否定“空匹配”:

这些都对“匹配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>

这适用于Firefox的SQLite管理器中的SQLite:

          select * from foo where not baz is not null
上面的查询返回列[baz]为空的行。:-)亚林,也许对你有用? (列名前的“not”不是打字错误)

此查询也会查找baz为null的行:

         select * from foo where [baz]  is  null

如果您正在测试PK列(?),并且该列被视为rowid的同义词,那么任何行的rowid都不会为null。

问题可能源于SQLite如何处理空列。例如,列为空并不意味着它为空。你测试过“”吗


该查询可能会返回结果。

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


字段='null'不允许。在您的环境中尝试一下

在您的col\u名称为空的地方尝试一下
其中ISNULL不包含空格

您的第一个
为NULL
语法正确。在本例中,您需要告诉我们如何将该命令发送到SQLite。该错误消息看起来不像是来自sqlite3命令行界面。Larry-通过PHP-使用phpliteadmin,在我的PHP代码中使用EZSQL。我猜phpliteadmin误报了其他一些问题。可能是丢失或定位错误的数据库文件,或者其他任何东西。否-我正在使用PHPLiteAdmin检查我自己的代码中出现错误的原因。在PHP中,警告是“PHP警告:SQL逻辑错误或缺少数据库”-同样,数据库、表和数据都在那里-如果不包括,则确切的语句可以正常工作。。。我知道这听起来很奇怪,但它是一个坏的或丢失的数据库文件。可能是(严重)不同版本的SQLite,或者更可能的是,您没有指示您的SQL库打开您认为要打开的文件。@pst-我很感激您的回答,但如果为NULL,则不起作用。我的语句被很好地分隔了,因为事实证明非空表达式是有效的。我知道这些文档是怎么说的,但这些是我得到的结果…@pst-如果有什么帮助,我正在通过PHP运行这些ezsql@Yarin什么版本的SQLite?我已经更新了我的答案,显示它按预期工作(在我的版本中)。一件非常可疑的事情是
x为NULL
“不起作用”。@pst-我也很可疑(请参阅我的编辑)-问题是我知道PHP中的SQLite与CLI SQLite不同-这准确吗?在这种情况下,我如何确定版本?从CLI。。。Mac OSX 10.6要测试的列的确切数据类型(CREATE TABLE语句中声明的逐字)是什么?奇怪。。。我刚刚发现,在某些情况下,字段为null是有效的。在我的情况下,列类型为INTEGER。Android API15仿真器列_name=0已工作。Android API15电话列名称为空(且为空)工作。希望这能帮助其他人。+1 parent_id=“”和parent_id”将始终有效
SELECT * FROM project WHERE parent_id = ""