2011-09-22 110 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,不能有空格