CodeGym /Các khóa học /SQL SELF /Xử lý NULL trong tính toán với COALESCE()

Xử lý NULL trong tính toán với COALESCE()

SQL SELF
Mức độ, Bài học
Có sẵn

Hôm nay tụi mình lại đào sâu vào chủ đề xử lý NULL và làm quen với một hàm cực kỳ hữu ích — COALESCE(). Hàm này giúp xử lý mấy giá trị NULL trong dữ liệu của bạn một cách cực kỳ gọn gàng.

Xem thử ví dụ này nhé: bạn có một bảng chứa thông tin nhân viên, nhưng một số người lại không có thông tin lương. Nếu bạn thử tăng lương cho tất cả thì sao? Chẳng ra gì đâu. Vì không thể thực hiện phép toán với NULL. Vậy nếu bạn muốn thay thế lương NULL thành 0 chẳng hạn? Đây là lúc COALESCE() xuất hiện.

COALESCE() — là một hàm trả về giá trị đầu tiên không phải NULL trong danh sách các tham số truyền vào. Nếu tất cả đều là NULL, hàm sẽ trả về NULL. Nói đơn giản, nó kiểu như: "Cho mình giá trị hợp lý đầu tiên mà bạn tìm thấy đi, làm ơn!"

Cú pháp

COALESCE(value1, value2, ..., value_n)

value1, value2, ..., value_n — là các tham số bạn truyền vào hàm. Nó sẽ trả về giá trị đầu tiên khác NULL.

Ví dụ dùng COALESCE()

Lấy vài ví dụ cho dễ hiểu nha.

Ví dụ 1: Thay NULL bằng 0

Giả sử bạn có bảng salaries:

id name salary
1 Otto 50000
2 Maria NULL
3 Alex 60000
4 Anna NULL

Bạn muốn tính tổng lương - cái này dễ thôi:

SELECT SUM(salary) AS total_salary
FROM salaries;

Hàm SUM() sẽ bỏ qua NULL, nên không có vấn đề gì.

Nhưng giờ bạn muốn tính tổng lương nếu mỗi nhân viên đều được thưởng 1000.

SELECT SUM(salary+1000) AS total_salary
FROM salaries;

Kết quả sẽ bị sai liền. Tốt nhất là loại bỏ giá trị NULL bằng hàm COALESCE và thay bằng 0. Xem cách làm nè:

SELECT SUM(COALESCE(salary, 0)) AS total_salary
FROM salaries;

Kết quả:

total_salary
110000

Như vậy sẽ ổn và an toàn hơn nhiều.

Ví dụ 2: Thay NULL bằng giá trị mặc định

Giả sử bạn có bảng students với tên và địa chỉ:

id name address
1 Anna Kanne
2 Peter NULL
3 Lisa Painful
4 Alex NULL

Bạn muốn thay NULL trong địa chỉ thành "Chưa có":

SELECT name, COALESCE(address, 'Chưa có') AS resolved_address
FROM students;

Kết quả truy vấn:

name resolved_address
Anna Kanne
Peter Chưa có
Lisa Painful
Alex Chưa có

Ví dụ 3: Dùng nhiều giá trị thay thế

Đôi khi NULL cần thay không chỉ bằng một giá trị mà là cả một dãy giá trị. Ví dụ, bạn muốn lấy tên, tên bạn bè hoặc dùng "Không tên" nếu không có gì cả. Bảng users:

user_id first_name short_name full_name
1 John Jonny Johnny Walker
2 NULL Pete Peter Kamen
3 NULL NULL

Truy vấn:

SELECT user_id,
       COALESCE(first_name, short_name, 'Không tên') AS display_name
FROM users;

Kết quả:

user_id display_name
1 John
2 Pete
3 Không tên

Ứng dụng thực tế của COALESCE()

Thực tế thì COALESCE() — là phao cứu sinh khi làm việc với dữ liệu không hoàn hảo.

Xem thử nó giúp gì trong các bài toán khác nhau nhé.

Ví dụ 1: Thay giá trị trong trường văn bản

Bảng gốc customers:

id name address
1 Alex Lin 123 Maple St
2 Maria Chi NULL
3 Anna Song 456 Oak Ave
4 Otto Art NULL
5 Liam Park 789 Pine Rd

Truy vấn:

SELECT name, COALESCE(address, 'Chưa có') AS address
FROM customers;

Kết quả:

name address
Alex Lin 123 Maple St
Maria Chi Chưa có
Anna Song 456 Oak Ave
Otto Art Chưa có
Liam Park 789 Pine Rd

Ví dụ 2: Chuẩn bị dữ liệu cho báo cáo

Bảng gốc sales:

id product price
1 Widget A 100
2 Widget B NULL
3 Widget C 250
4 Widget D NULL
5 Widget E 300

Truy vấn:

SELECT SUM(COALESCE(price, 0)) AS total_sales
FROM sales;

Kết quả:

total_sales
650

Lỗi thường gặp khi dùng COALESCE()

Dù COALESCE() nhìn thì đơn giản và đa năng, nhưng vẫn có vài bẫy nhỏ dễ dính lắm nha.

Không khớp kiểu dữ liệu. Tất cả tham số truyền vào COALESCE() phải cùng kiểu dữ liệu. Ví dụ, không thể trộn giá trị chuỗi và số được.

-- Lỗi
SELECT COALESCE(salary, 'Chưa có') FROM employees; 
-- salary — trường số, còn 'Chưa có' — là chuỗi.

Không chú ý thứ tự tham số. COALESCE() trả về giá trị đầu tiên không phải NULL, nên thứ tự tham số rất quan trọng nha.

2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Thay thế giá trị NULL bằng giá trị mặc định
Thay thế giá trị NULL bằng giá trị mặc định
2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Thay thế giá trị NULL với nhiều mức độ ưu tiên
Thay thế giá trị NULL với nhiều mức độ ưu tiên
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION