在本教學中,您將瞭解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')
返回MySQLNULLIF
,因為兩個字串不相等。NULLIF(1,NULL)
返回1
,因為1
不等於NULL
。NULLIF(NULL,1)
返回第一個參數,即NULL
,因為NULL
不等於1
。
使用NULLIF函數來防止除零錯誤
我們經常使用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
。
我們來看看示例資料庫(zaixiandb)中的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 set
MySQL發出錯誤,因為在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
函數,這在某些情況下非常方便,例如阻止查詢中的零錯誤。