2010-06-13 88 views
2

我知道NULL值與空字符串("")值之間的區別是什麼,但如果我想通過使用OR關鍵字獲取值,則不會得到NULLMySQL:獲取空字符串或空字符串

我想查詢看起來像這樣的表:

titles_and_tags 
+----+----------+------+ 
| id | title | tag | 
+----+----------+------+ 
| 1 | title1 | NULL | 
| 2 | title2 | tag1 | 
| 3 | title3 | tag2 | 
| 4 | edit  | NULL | 
| 5 | rowdata | div | 
+----+----------+------+ 

我使用的查詢是這樣的:

select * 
    from `titles_and_tags` 
WHERE `title` LIKE "title%" 
    AND `tag` = "tag1" OR `tag` IS NULL 

所以我想在這裏得到一個行(id:1,2),但這會導致0行。我做錯了什麼?

編輯

對不起,我忘了這就是我的主要問題是:

select * 
    from `titles_and_tags` 
WHERE `title` LIKE "title%" 
AND `tag` = "tag1" OR `tag` LIKE '%' 

所以這更像是一個題外話,對不起

+0

我想同樣的事情,它並返回零行。爲什麼? – 2010-06-13 20:52:55

+0

甚至 從'titles_and_tags'選擇* WHERE'tag' IS NULL'將返回零,我想 – 2010-06-13 20:59:00

+0

@Taz:不適合我。你確定你正在執行查詢嗎? 'SELECT * FROM titles_and_tags'是否返回任何行? – 2010-06-13 21:00:49

回答

4

嘗試

select 
    * 
from 
    `titles_and_tags` 
WHERE 
    `title` LIKE "title%" AND 
    (`tag` = "tag1" OR `tag` IS NULL) 

您已離開通配符%關閉like,此外,爲了清晰起見,還應在括號內附上or子句,並將邏輯顯式分組在一起,以確保其按照您的意圖執行。

編輯: 在您的編輯tag like '%'會匹配所有的行中的標籤不null任何比較除isnot isnull值是假的。我不確定你想要用最後一個查詢來做什麼,但我懷疑你最初問這個問題的那個更像你想要的。

+0

好吧,通配符不是問題,它的存在,我只是忘了在這裏添加它,但感謝感知:) – 2010-06-13 20:38:49

+2

+1雖然括號*做*這個查詢很重要。示例數據沒有顯示出差異。嘗試插入一行(4,'nottitle',NULL),然後比較有無括號。 – 2010-06-13 20:39:29

+0

好吧,現在這代表我目前的數據庫結構,幾乎完美(除了,還有幾列:)) – 2010-06-13 20:42:06

0

根據您的意見,我的猜測是您已將字符串'NULL'或空字符串''插入數據庫而不是特殊值NULL。要確認此操作,請嘗試以下查詢:

SELECT * 
FROM titles_and_tags 
WHERE tag IN ('NULL', '') 

如果此操作返回任何行,那就是您的問題。

0

嘗試(不要換列名稱標籤在任何內容。或者,如果你包起來使用backtics而不是單引號。安東尼的建議)

select * 
    from `titles_and_tags` 
WHERE title LIKE "title%" 
    AND (tag = "tag1" OR tag IS NULL) 
+0

您只需要反引用MySQL關鍵字,並在GROUP BY/HAVING子句中引用列別名。 – 2010-06-14 23:20:52