假设有一数据表的状态字段设计为varchar类型,有以下值:NULL,pending,refund,cancel. 我们知道查询状态为cancel的订单,SQL语句可以这样写:SELECT * FROM qorder WHERE status = 'cancel' SQL语句能查询出正确的数据,但是当我们想查询状态为非cancel的订单时,可能会出麻烦, 因为status字段没 有设置NOT NULL,所以大部分订单的status值都是NULL,这样的话,用'<>'查询出来的数据不正确,只有status除了cancel之外的非空数据查询出来了,而为NULL的没有查询出来。

        SELECT * WHERE status <>'cancel' 原 因:NULL值操作 NULL值可能令人感到奇怪直到你习惯它。概念上,NULL意味着“没有值”或“未知值”,且它被看作与众不同的值。为了测试NULL,你不能使用算术比较 操作符例如=、<或!=。为了说明它,试试下列查询:mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL; 
    +----------+-----------+----------+----------+ 
    | 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL | 
    +----------+-----------+----------+----------+ 
    | NULL | NULL | NULL | NULL | 
    +----------+-----------+----------+----------+ 
很 显然你不能通过这些比较得到有意义的结果。

相反使用IS NULL和IS NOT NULL操作符:mysql> SELECT 1 IS NULL, 1 IS NOT NULL; 
+-----------+---------------+ 
| 1 IS NULL | 1 IS NOT NULL | 
+-----------+---------------+ 
| 0 | 1 | 
+-----------+---------------+ 
请注意在MySQL中,0或 NULL意味着假,而其它值意味着真。布尔运算的默认真值是1。根据以上的NULL值操作结果,最终使用此种方式解决:SELECT *qorder  WHERE IFNULL(status,'pending') <>'cancel'

IFNULL(expr1,expr2) 

如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使 用的上下文环境。 

复制代码代码如下:


mysql> select IFNULL(1,0); ->1 
mysql> select IFNULL(0,10); ->0 
mysql> select IFNULL(1/0,10); ->10.0000 
mysql> select IFNULL(1/0,'yes'); ->'yes'IF(expr1,expr2,expr3)如果expr1是TRUE(expr1<>0且expr1<>NULL),那么IF()返回 expr2,否则它返回expr3。IF()返回一个数字或字符串值,取决于它被使用的上下文。 
mysql> select IF(1>2,2,3); -> 3 
mysql> select IF(1<2,'yes','no'); -> 'yes'