2011-09-22 112 views
30

这是一个奇怪的一个:WHERE - IS 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; 

全部退货:

There is a problem with the syntax of your query (Query was not executed) ...

UPDATE

我通过我的ezSQl代码PHP的这样做的,使用PHPLiteAdmin接口

使用PHPLiteAdmin demo,这种表达工程─所以我现在怀疑我的PHP的SQLite版本问题?那可能吗?这种表情总是有效吗?

更新2

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

PHP Warning: SQL logic error or missing database

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

更新3

唯一的其他可能的线索,我是说我用PHP创建数据库不能通过CLI读取,反之亦然。我得到:

Error: file is encrypted or is not a database

因此,这里有两个SQlite口味对接头。 (See this)仍然,为什么无效的声明?

UPDATE 4

OK我想我已经追踪问题的罪魁祸首,如果不是reason-我用PHP ezSQL创建的DB是一个在IS NULL语句失败。如果我使用PHP的SQLite3类创建数据库,那么声明可以正常工作,而且,我可以从CLI访问数据库,而ezSQL创建的数据库给出了file is encrypted错误。

所以我做了一点挖掘ezSQL代码 - 蝙蝠我看到它使用PDO方法,而不是新的SQLite3类。也许这是一些东西 - 我不会浪费更多的时间...

在任何情况下,我发现我的解决方案,这是为了避开ezSQL,只使用PHPs SQLite3类。

+4

你的第一个'IS NULL'语法是正确的。在这种情况下,您需要告诉我们您如何将该命令发送给SQLite。该错误消息看起来不像来自sqlite3命令行界面。使用phpliteadmin http://www.danedesigns.com/phpliteadmin.php并与ezsql –

+0

Larry-通过PHP的是PHPLiteAdmin被虚报了一些其他问题。可能是丢失或错误定位的数据库文件,或其他任何东西。 – Yarin

+1

我猜我的PHP代码 –

回答

41

a IS ba IS NOT b是其中ab是表达式的一般形式。

这通常仅见于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 

这些都是有效的“匹配空”:

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

@ pst-我很欣赏答案,但IS NULL不起作用。我的陈述被分隔得很好,因为IS NOT NULL表达式起作用。我知道什么文档说,但这些是我得到的结果... – Yarin

+0

@ pst-如果有任何帮助,我通过PHP运行这些ezsql – Yarin

+0

@Yarin什么版本的SQLite?我更新了我的答案,显示它按预期工作(在我的版本中)。 *非常可疑的一件事是* x IS NULL'“不起作用”。 – 2011-09-22 18:45:29

1

这部作品的SQLite在SQLite的经理火狐:

  select * from foo where not baz is not null 

上面的查询返回行,其中列[巴兹]为空。 :-) Yarin,也许它会为你工作? (列名不是拼写错误之前的“不”)。

此查询过查找行,其中巴兹为空:(?)

  select * from foo where [baz] is null 
+0

什么是您试图测试为null的列的确切数据类型(在您的CREATE TABLE语句中声明的逐字)? – Tim

0

如果要测试也许是PK列,列被视为同义词ROWID,则没有行有一个rowid那是空的。

7

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

SELECT * FROM project WHERE parent_id = "" 

该查询可能会返回结果。

+0

+1 parent_id =“”和parent_id <>“” 将始终工作 –

5

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

字段= '空'一样。试一试在你的环境

+0

奇怪......我刚刚发现,在某些情况下*其中字段为空*作品。 –

+1

在我的情况列类型是INTEGER。 Android API15模拟器column_name = 0工作。 Android API15电话列名ISNULL(和IS NULL)工作。希望能帮助别人。 –

0

尝试在那里your_col_name ISNULL 何在ISNULL,不能有空格