Trong MySQL, NULLIF()
là một hàm điều khiển luồng trả về NULL
nếu cả hai đối số của nó là tương đương. Nếu không, nó trả về đối số đầu tiên.
Cú pháp
Cú pháp như sau:
NULLIF(expr1,expr2)
Ví dụ
Dưới đây là một ví dụ để chứng minh:
SELECT NULLIF( 7, 7 );
Kết quả:
NULL
Trong trường hợp này, cả hai đối số đều giống hệt nhau và do đó kết quả là NULL
.
Khi các đối số không tương đương
Đây là những gì sẽ xảy ra khi các đối số không tương đương:
SELECT NULLIF( 7, 8 );
Kết quả:
7
Các đối số khác nhau và do đó, đối số đầu tiên được trả về.
Chuỗi
Dưới đây là một ví dụ so sánh các chuỗi:
SELECT
NULLIF( 'Bean', 'Bean' ) AS "Same",
NULLIF( 'Bean', 'Mushroom' ) AS "Different";
Kết quả:
Same Different ---- --------- NULL Bean
Ngày
Dưới đây là một ví dụ so sánh các ngày:
SELECT
NULLIF( DATE '2030-12-20', DATE '2030-12-20' ) AS "Same",
NULLIF( DATE '2030-12-20', DATE '2035-08-15' ) AS "Different";
Kết quả:
Same Different ---- ---------- NULL 2030-12-20
Biểu thức
NULLIF()
đánh giá giá trị hiện tại của các biểu thức. Do đó, nếu chúng ta truyền một biểu thức như sau:
SELECT NULLIF( 8, 2 * 4 );
Chúng tôi nhận được điều này:
NULL
2 nhân với 4 được 8 và do đó hai đối số là tương đương.
Đây là những gì sẽ xảy ra nếu chúng ta thay đổi đối số thứ hai:
SELECT NULLIF( 8, 2 * 3 );
Kết quả:
8
Đối số đầu tiên được trả về.
Một ví dụ về cơ sở dữ liệu
Giả sử chúng ta chạy truy vấn sau:
SELECT
Name,
LocalName
FROM country
WHERE Region = 'Southern Europe'
ORDER BY Name;
Kết quả:
+-------------------------------+--------------------------------+ | Name | LocalName | +-------------------------------+--------------------------------+ | Albania | Shqipëria | | Andorra | Andorra | | Bosnia and Herzegovina | Bosna i Hercegovina | | Croatia | Hrvatska | | Gibraltar | Gibraltar | | Greece | Elláda | | Holy See (Vatican City State) | Santa Sede/Città del Vaticano | | Italy | Italia | | Macedonia | Makedonija | | Malta | Malta | | Portugal | Portugal | | San Marino | San Marino | | Slovenia | Slovenija | | Spain | España | | Yugoslavia | Jugoslavija | +-------------------------------+--------------------------------+
Ở đây, chúng ta có tên quốc gia ở cột bên trái và tên địa phương của quốc gia tương ứng ở bên phải.
Hãy thêm NULLIF()
đến cột thứ ba trong truy vấn của chúng tôi:
SELECT
Name,
LocalName,
NULLIF(LocalName, Name) AS "Local Name if Different"
FROM country
WHERE Region = 'Southern Europe'
ORDER BY Name;
Kết quả:
+-------------------------------+--------------------------------+--------------------------------+ | Name | LocalName | Local Name if Different | +-------------------------------+--------------------------------+--------------------------------+ | Albania | Shqipëria | Shqipëria | | Andorra | Andorra | NULL | | Bosnia and Herzegovina | Bosna i Hercegovina | Bosna i Hercegovina | | Croatia | Hrvatska | Hrvatska | | Gibraltar | Gibraltar | NULL | | Greece | Elláda | Elláda | | Holy See (Vatican City State) | Santa Sede/Città del Vaticano | Santa Sede/Città del Vaticano | | Italy | Italia | Italia | | Macedonia | Makedonija | Makedonija | | Malta | Malta | NULL | | Portugal | Portugal | NULL | | San Marino | San Marino | NULL | | Slovenia | Slovenija | Slovenija | | Spain | España | España | | Yugoslavia | Jugoslavija | Jugoslavija | +-------------------------------+--------------------------------+--------------------------------+
Chúng ta có thể thấy rằng cột thứ ba chỉ trả về tên cục bộ nếu nó khác với giá trị trong Name
cột. Nếu nó giống nhau thì NULL
được trả lại.
Chúng tôi cũng có thể sử dụng NULLIF()
để lọc kết quả truy vấn của chúng tôi:
SELECT
Name,
LocalName
FROM country
WHERE Region = 'Southern Europe'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;
Kết quả:
+-------------------------------+--------------------------------+ | Name | LocalName | +-------------------------------+--------------------------------+ | Albania | Shqipëria | | Bosnia and Herzegovina | Bosna i Hercegovina | | Croatia | Hrvatska | | Greece | Elláda | | Holy See (Vatican City State) | Santa Sede/Città del Vaticano | | Italy | Italia | | Macedonia | Makedonija | | Slovenia | Slovenija | | Spain | España | | Yugoslavia | Jugoslavija | +-------------------------------+--------------------------------+
Trong trường hợp này, chúng tôi chỉ trả về những hàng có tên cục bộ khác với Name
cột.
NULLIF()
so với CASE
Đoạn mã sau:
NULLIF(expr1,expr2)
tương đương với CASE
sau biểu thức:
CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
Đếm tham số không chính xác
Truyền sai số đối số, dẫn đến lỗi:
SELECT NULLIF( 5 );
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'