Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Chọn giá trị NOT NULL từ 2 cột trong MySQL (IFNULL, COALESCE, CASE, IF)

Khi có 2 cột và muốn lấy giá trị của cột nào **không phải NULL** (ưu tiên cột 1, nếu NULL thì lấy cột 2), MySQL cung cấp 4 cách tiếp cận.

Cú pháp 4 phương pháp

1. IFNULL() - 2 đối số, chỉ MySQL

SELECT IFNULL(cot1, cot2) AS ket_qua FROM ten_bang;

2. COALESCE() - Chuẩn ANSI SQL, nhiều đối số

SELECT COALESCE(cot1, cot2) AS ket_qua FROM ten_bang;

3. CASE WHEN - Linh hoạt, chuẩn SQL

SELECT CASE 
    WHEN cot1 IS NOT NULL THEN cot1 
    ELSE cot2 
END AS ket_qua FROM ten_bang;

4. IF() - Hàm điều kiện MySQL

SELECT IF(cot1 IS NULL, cot2, cot1) AS ket_qua FROM ten_bang;

Ví dụ minh họa

1. Tạo bảng

CREATE TABLE SelectNotNullColumnsDemo (
    Id INT NOT NULL AUTO_INCREMENT,
    Name VARCHAR(20),
    Age INT,
    PRIMARY KEY(Id)
);

2. Chèn dữ liệu (mỗi hàng 1 cột NULL)

INSERT INTO SelectNotNullColumnsDemo(Name, Age) VALUES('John', NULL);
INSERT INTO SelectNotNullColumnsDemo(Name, Age) VALUES(NULL, 23);

3. Xem dữ liệu

SELECT * FROM SelectNotNullColumnsDemo;

Kết quả:

+----+------+------+
| Id | Name | Age  |
+----+------+------+
| 1  | John | NULL |
| 2  | NULL | 23   |
+----+------+------+

4. Kết quả 4 phương pháp (giống nhau)

-- Cách 1: IFNULL
SELECT IFNULL(Name, Age) AS NotNULLValue FROM SelectNotNullColumnsDemo;

-- Cách 2: COALESCE
SELECT COALESCE(Name, Age) AS NotNULLValue FROM SelectNotNullColumnsDemo;

-- Cách 3: CASE
SELECT CASE WHEN Name IS NOT NULL THEN Name ELSE Age END AS NotNULLValue 
FROM SelectNotNullColumnsDemo;

-- Cách 4: IF
SELECT IF(Name IS NULL, Age, Name) AS NotNULLValue FROM SelectNotNullColumnsDemo;

Kết quả (tất cả 4 cách):

+--------------+
| NotNULLValue |
+--------------+
| John         |
| 23           |
+--------------+

So sánh chi tiết

Tiêu chíIFNULLCOALESCECASEIF
Số đối số2≥2Linh hoạt3
Chuẩn SQLMySQL onlyANSIANSIMySQL only
Xử lý kiểu dữ liệu khác nhauÉp kiểu ngầmÉp kiểu ngầmKiểm soát rõ ràngÉp kiểu ngầm
Điều kiện phức tạpKhôngKhôngCóCó (lồng nhau)
Hiệu năngRất nhanhRất nhanhNhanhNhanh

Mở rộng: 3+ cột fallback

-- COALESCE: Lấy cột đầu tiên không NULL
SELECT COALESCE(cot1, cot2, cot3, 'MacDinh') FROM bang;

-- CASE: Logic phức tạp
SELECT CASE 
    WHEN cot1 IS NOT NULL THEN cot1
    WHEN cot2 IS NOT NULL THEN CONCAT('[', cot2, ']')
    WHEN cot3 IS NOT NULL THEN UPPER(cot3)
    ELSE 'Khong co du lieu'
END FROM bang;

Khuyến nghị

  • 2 cột, đơn giản: COALESCE(cot1, cot2) (chuẩn SQL, dễ đọc)
  • Nhiều cột fallback: COALESCE(cot1, cot2, cot3, ...)
  • Logic điều kiện/định dạng: CASE WHEN ...
  • Tránh IFNULL/IF nếu cần code portable sang PostgreSQL, SQL Server, Oracle