MySQL không có toán tử ternary ? : như C/C++, nhưng đạt được kết quả tương tự bằng CASE WHEN ... THEN ... ELSE ... END.
So sánh C vs MySQL
C/C++ ternary
int result = (X > 1 && (X-Y) < 0) ? X : (X-Y);
MySQL CASE WHEN
SELECT CASE
WHEN tbl.X > 1 AND (tbl.X - tbl.Y) < 0 THEN 0
ELSE (tbl.X - tbl.Y)
END AS Result
FROM TernaryOperationDemo tbl;
Ví dụ minh họa
Tạo bảng và chèn dữ liệu:
mysql> CREATE TABLE TernaryOperationDemo (X INT, Y INT); mysql> INSERT INTO TernaryOperationDemo VALUES(10, 5); mysql> INSERT INTO TernaryOperationDemo VALUES(5, 15); mysql> INSERT INTO TernaryOperationDemo VALUES(20, 15); mysql> INSERT INTO TernaryOperationDemo VALUES(15, 25); mysql> INSERT INTO TernaryOperationDemo VALUES(10, -11);
Dữ liệu:
+------+------+ | X | Y | +------+------+ | 10 | 5 | | 5 | 15 | | 20 | 15 | | 15 | 25 | | 10 | -11 | +------+------+
Áp dụng logic ternary:
mysql> SELECT CASE
-> WHEN tbl.X > 1 AND (tbl.X - tbl.Y) < 0 THEN 0
-> ELSE (tbl.X - tbl.Y)
-> END AS Result
-> FROM TernaryOperationDemo tbl;
Kết quả:
+--------+ | Result | +--------+ | 5 | | 0 | | 5 | | 0 | | 21 | +--------+
Các dạng CASE trong MySQL
Simple CASE (so sánh giá trị)
CASE cot
WHEN gia_tri_1 THEN ket_qua_1
WHEN gia_tri_2 THEN ket_qua_2
ELSE ket_qua_mac_dinh
END
Searched CASE (điều kiện phức tạp) - dùng cho ternary
CASE
WHEN dieu_kien_1 THEN ket_qua_1
WHEN dieu_kien_2 THEN ket_qua_2
ELSE ket_qua_mac_dinh
END
MySQL 8.0: Hàm IF() và IFNULL()
IF(dieu_kien, true_val, false_val)- gần ternary nhấtIFNULL(cot, gia_tri_mac_dinh)- thay NULL bằng giá trịNULLIF(cot1, cot2)- trả NULL nếu hai cột bằng nhau
Ví dụ dùng IF() cho ternary:
SELECT IF(tbl.X > 1 AND (tbl.X - tbl.Y) < 0, 0, tbl.X - tbl.Y) AS Result FROM TernaryOperationDemo tbl;