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

时间:2011-09-22 18:27:12

标签: sqlite ezsql

这是一个奇怪的:

我可以从SQLite过滤NOT NULLS,但不能过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 demo,这个表达式有效 - 所以现在我怀疑PHP的SQLite存在版本问题?可能是吗?这个表达式总是有效吗?

更新2

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

  

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

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

更新3

我唯一可能的其他线索是我用PHP创建的数据库无法被CLI读取,反之亦然。我明白了:

  

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

所以肯定会有两种SQlite口味。 (See this)仍然,为什么无效的陈述?

更新4

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

所以我对ezSQL代码进行了一些挖掘 - 关键是我看到它使用的是PDO方法,而不是更新的SQLite3类。也许这就是事情 - 我不会再浪费时间了......

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

6 个答案:

答案 0 :(得分:42)

a IS ba IS NOT bab是表达式的一般形式。

这通常仅见于a IS NULLa IS NOT NULL个案例。还有ISNULLNOTNULL(也是NOT NULL)运算符,它们分别是前面表达式的简写(它们只接受一个操作数)。

SQLite表达式中理解的SQL包含在SQLite Query Language: Expressions中。

如果使用CLI,请确保先前使用;终止(之前)语句。

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

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>

答案 1 :(得分:7)

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

SELECT * FROM project WHERE parent_id = ""

该查询可能会返回结果。

答案 2 :(得分:5)

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

field ='null'。在您的环境中尝试一下

答案 3 :(得分:1)

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

          select * from foo where not baz is not null

上面的查询返回列[baz]为空的行。 :-) Yarin,也许它适合你? (列名前面的'not'不是拼写错误。)

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

         select * from foo where [baz]  is  null

答案 4 :(得分:0)

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

答案 5 :(得分:0)

尝试your_col_name ISNULL ISNULL不包含空格