2016-07-04 64 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; 

这一点适用于所有数据类型,不仅枚举。