Trong MariaDB, NULLIF()
hàm 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( 5, 5 );
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( 5, 3 );
Kết quả:
5
Trong trường hợp này, đố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( 'Papaya', 'Papaya' ) AS "Same",
NULLIF( 'Papaya', 'Salad' ) AS "Different";
Kết quả:
+------+-----------+ | Same | Different | +------+-----------+ | NULL | Papaya | +------+-----------+
Ngày
Dưới đây là một ví dụ so sánh các ngày:
SELECT
NULLIF( DATE '2000-10-30', DATE '2000-10-30' ) AS "Same",
NULLIF( DATE '2000-10-30', DATE '1999-10-30' ) AS "Different";
Kết quả:
+------+------------+ | Same | Different | +------+------------+ | NULL | 2000-10-30 | +------+------------+
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( 10, 2 * 5 );
Chúng tôi nhận được điều này:
NULL
2 nhân với 5 được 10 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( 10, 3 * 5 );
Kết quả:
10
Đố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
ORDER BY Name ASC
LIMIT 10;
Kết quả:
+---------------------+-----------------------+ | Name | LocalName | +---------------------+-----------------------+ | Afghanistan | Afganistan/Afqanestan | | Albania | Shqipëria | | Algeria | Al-Jaza’ir/Algérie | | American Samoa | Amerika Samoa | | Andorra | Andorra | | Angola | Angola | | Anguilla | Anguilla | | Antarctica | – | | Antigua and Barbuda | Antigua and Barbuda | | Argentina | Argentina | +---------------------+-----------------------+
Ở đâ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 Different"
FROM country
ORDER BY Name ASC
LIMIT 10;
Kết quả:
+---------------------+-----------------------+-----------------------+ | Name | LocalName | Local Name Different | +---------------------+-----------------------+-----------------------+ | Afghanistan | Afganistan/Afqanestan | Afganistan/Afqanestan | | Albania | Shqipëria | Shqipëria | | Algeria | Al-Jaza’ir/Algérie | Al-Jaza’ir/Algérie | | American Samoa | Amerika Samoa | Amerika Samoa | | Andorra | Andorra | NULL | | Angola | Angola | NULL | | Anguilla | Anguilla | NULL | | Antarctica | – | – | | Antigua and Barbuda | Antigua and Barbuda | NULL | | Argentina | Argentina | NULL | +---------------------+-----------------------+-----------------------+
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.
Ngoài ra, chúng ta 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 NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name ASC
LIMIT 10;
Kết quả:
+----------------+-----------------------+ | Name | LocalName | +----------------+-----------------------+ | Afghanistan | Afganistan/Afqanestan | | Albania | Shqipëria | | Algeria | Al-Jaza’ir/Algérie | | American Samoa | Amerika Samoa | | Antarctica | – | | Armenia | Hajastan | | Austria | Österreich | | Azerbaijan | Azärbaycan | | Bahamas | The Bahamas | | Bahrain | Al-Bahrayn | +----------------+-----------------------+
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( 10 );
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'