admin管理员组文章数量:1794759
MySQL nullif()函数
转载自 MySQL nullif()函数
MySQL NULLIF函数简介NULLIF函数是接受2个参数的控制流函数之一。如果第一个参数等于第二个参数,则NULLIF函数返回NULL,否则返回第一个参数。
NULLIF函数的语法如下:
NULLIF(expression_1,expression_2);如果expression_1 = expression_2为true,则NULLIF函数返回NULL,否则返回expression_1 。
请注意,NULLIF函数与以下使用CASE的表达式类似:
CASE WHEN expression_1 = expression_2 THEN NULL ELSE expression_1 END;
请注意,不要将NULLIF函数与IFNULL函数混淆。
MySQL NULLIF示例我们来看一下使用NULLIF函数来了解它的工作原理的一些例子。
示例-1
mysql> SELECT NULLIF(1,1); +-------------+ | NULLIF(1,1) | +-------------+ | NULL | +-------------+ 1 row in set示例-2
mysql> SELECT NULLIF(1,2); +-------------+ | NULLIF(1,2) | +-------------+ | 1 | +-------------+ 1 row in set示例-3
mysql> SELECT NULLIF('MySQL NULLIF','MySQL NULLIF'); +---------------------------------------+ | NULLIF('MySQL NULLIF','MySQL NULLIF') | +---------------------------------------+ | NULL | +---------------------------------------+ 1 row in set示例-4
mysql> SELECT NULLIF('MySQL NULLIF','MySQL IFNULL'); +---------------------------------------+ | NULLIF('MySQL NULLIF','MySQL IFNULL') | +---------------------------------------+ | MySQL NULLIF | +---------------------------------------+ 1 row in set示例-6
mysql> SELECT NULLIF(1,NULL); +----------------+ | NULLIF(1,NULL) | +----------------+ | 1 | +----------------+ 1 row in set示例-7
mysql> SELECT NULLIF(NULL,1); +----------------+ | NULLIF(NULL,1) | +----------------+ | NULL | +----------------+ 1 row in set上面示例中的语句是如何工作的?
- NULIF(1,1)返回NULL,因为1等于1。
- NULLIF(1,2)返回1,这是第一个参数,因为1不等于2。
- NULLIF('MySQL NULLIF','MySQL NULLIF')返回NULL,因为两个参数是相同的字符串。
- NULLIF('MySQL NULLIF','MySQL NULLIF')返回MySQL NULLIF,因为两个字符串不相等。
- NULLIF(1,NULL)返回1,因为1不等于NULL。
- NULLIF(NULL,1)返回第一个参数,即NULL,因为NULL不等于1。
我们经常使用NULLIF函数来阻止在查询中除以零错误。如果MySQL服务器启用了ERROR_FOR_DIVISION_BY_ZERO模式,则当发生零除数时将发出错误。
见下列查询语句:
SELECT 1/0; -- cause error上面语句得到以下结果 -
mysql> SELECT 1/0; +------+ | 1/0 | +------+ | NULL | +------+ 1 row in set在这种情况下,您可以使用NULLIF函数来阻止除以零,如下所示:
SELECT 1/NULLIF(0,0); -- return NULL因为0等于0,所以NULLIF(0,0)表达式返回NULL。结果语句返回NULL。
我们来看看示例数据库(yiibaidb)中的orders表,其结构如下所示 -
mysql> desc orders; +----------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+-------------+------+-----+---------+-------+ | orderNumber | int(11) | NO | PRI | NULL | | | orderDate | date | NO | | NULL | | | requiredDate | date | NO | | NULL | | | shippedDate | date | YES | | NULL | | | status | varchar(15) | NO | | NULL | | | comments | text | YES | | NULL | | | customerNumber | int(11) | NO | MUL | NULL | | +----------------+-------------+------+-----+---------+-------+ 7 rows in set首先,要获取2013年6月创建的所有订单,请使用以下查询:
SELECT orderNumber, orderdate, requiredDate, shippedDate, status FROM orders WHERE orderDate BETWEEN '2013-06-01' AND '2013-06-30';执行上面查询语句得到以下结果 -
+-------------+------------+--------------+-------------+---------+ | orderNumber | orderdate | requiredDate | shippedDate | status | +-------------+------------+--------------+-------------+---------+ | 10127 | 2013-06-03 | 2013-06-09 | 2013-06-06 | Shipped | | 10128 | 2013-06-06 | 2013-06-12 | 2013-06-11 | Shipped | | 10129 | 2013-06-12 | 2013-06-18 | 2013-06-14 | Shipped | | 10130 | 2013-06-16 | 2013-06-24 | 2013-06-21 | Shipped | | 10131 | 2013-06-16 | 2013-06-25 | 2013-06-21 | Shipped | | 10132 | 2013-06-25 | 2013-07-01 | 2013-06-28 | Shipped | | 10133 | 2013-06-27 | 2013-07-04 | 2013-07-03 | Shipped | +-------------+------------+--------------+-------------+---------+ 7 rows in set第二,计算2013年6月发货订单数量/取消订单数量,可使用SUM和IF函数。
SELECT SUM(IF(status = 'Shipped',1,0)) / SUM(IF(status = 'Cancelled',1,0)) FROM orders WHERE orderDate BETWEEN '2013-06-01' and '2013-06-30';执行上面查询语句,得到以下结果 -
+------------------------------------------------------------------------+ | SUM(IF(status = 'Shipped',1,0)) /SUM(IF(status = 'Cancelled',1,0)) | +------------------------------------------------------------------------+ | NULL | +------------------------------------------------------------------------+ 1 row in setMySQL发出错误,因为在2013年6月没有创建取消订单。 这意味着表达式SUM(IF(status ='Cancelled',1,0))返回0。
第三,为了防止除0错误,您可以使用NULLIF函数,如下查询:
SELECT SUM(IF(status = 'Shipped', 1, 0)) /NULLIF(SUM(IF(status = 'Cancelled', 1, 0)), 0) FROM orders WHERE orderDate BETWEEN '2013-06-01' AND '2013-06-30';执行上面查询语句,得到以下结果 -
+-------------------------------------------------------------------------+ | SUM(IF(status = 'Shipped', 1, 0)) /NULLIF(SUM(IF(status = 'Cancelled', 1, 0)), 0) | +-------------------------------------------------------------------------+ | NULL | +-------------------------------------------------------------------------+ 1 row in set因为2013年6月没有创建取消订单,所以SUM(IF(status ='Cancelled',1,0))返回0,这也使得NULLIF(SUM(IF(status ='Cancelled',1,0) ,0)表达式返回NULL值。
在本教程中,我们向您介绍了NULLIF函数,这在某些情况下非常方便,例如阻止查询中的零错误
版权声明:本文标题:MySQL nullif()函数 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686497879a74174.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论