2016-07-04 59 views
1

我應該開始說我知道如何檢查SET數據類型的存在,但是,我現在試圖否定查找,這似乎不工作,所以我假設我在做一些愚蠢的事情。MySQL其中值不在SET數據類型字段

我有了這個領域:

| billing_payment_prefs | set('allow_admin','allow_trans','allow_supress','requires_nag')  | YES |  | NULL    |        | 

所有記錄,目前對上述勵磁NULL。我有3000+的記錄在該表中,並運行下面的查詢:

mysql> select count(id) from customers where billing_payment_prefs not like '%allow_trans%'; 
+-----------+ 
| count(id) | 
+-----------+ 
|   0 | 
+-----------+ 
1 row in set (0.00 sec) 

...我得到0,而不是3000加(這是我所期待的,因爲它們都是NULL)。現在,我顯然不確定如何查找針對SET字段的NOT LIKE,但我曾假設(錯誤地按照事物的外觀),這將起作用,儘管MYSQL DEV沒有提及它。

任何幫助,非常感謝。謝謝。

+0

你有沒有試過'客戶SELECT COUNT(ID),其中billing_payment_prefs不喜歡「%allow_trans%」或billing_payment_prefs是空嗎? –

回答

2

你沒有得到記錄的原因是因爲MySQL(以及大多數RDBMS)將NULL視爲特殊值。將一些文字與NULL進行比較不會產生真實或錯誤,而是產生NULL,因爲將未知值與已知值進行比較會得出未知結果。

爲了讓您的查詢工作的邏輯,你可以添加一個條件NULL檢查:

SELECT COUNT(id) 
FROM customers 
WHERE billing_payment_prefs NOT LIKE '%allow_trans%' OR 
     billing_payment_prefs IS NULL 
+1

非常感謝。我曾認爲是這樣,只是需要更有知識的人來證實。 – LokiSinclair

2

你必須明確檢查NULL值:

select count(id) 
from customers 
where billing_payment_prefs not like '%allow_trans%' or 
     billing_payment_prefs is null; 

這一點適用於所有數據類型,不僅枚舉。