Làm việc với NULL xuất hiện ở rất nhiều tình huống: từ xử lý dữ liệu thiếu trong báo cáo cho đến lọc và sắp xếp. Nếu phải chọn giữa việc không có giá trị trong bảng và một con số kỳ lạ kiểu 9999, đa số sẽ chọn NULL — ừ thì, nó không tiện lắm, nhưng ít ra là thật thà. Cùng xem vài case điển hình nhé.
Ví dụ: sắp xếp sản phẩm với giá bị thiếu
Giả sử bạn đang quản lý một shop online, và bạn có bảng sản phẩm như sau:
| product_id | name | price |
|---|---|---|
| 1 | Điện thoại | 45000 |
| 2 | Laptop | NULL |
| 3 | Máy ảnh | 25000 |
| 4 | Đồng hồ thông minh | NULL |
Bạn muốn sắp xếp sản phẩm theo giá, trong đó sản phẩm không có giá (NULL) sẽ nằm ở cuối.
SELECT product_id, name, price
FROM products
ORDER BY price ASC NULLS LAST;
Kết quả:
| product_id | name | price |
|---|---|---|
| 3 | Máy ảnh | 25000 |
| 1 | Điện thoại | 45000 |
| 2 | Laptop | NULL |
| 4 | Đồng hồ thông minh | NULL |
Lưu ý cú pháp quan trọng NULLS LAST. Mặc định PostgreSQL với ASC sẽ để NULL lên đầu, nhưng với tham số này thì nó sẽ nằm cuối.
Ví dụ: lọc sinh viên không có ngày sinh
Bạn có bảng sinh viên và muốn chọn ra những ai chưa có ngày sinh.
| student_id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | NULL |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | NULL |
Truy vấn:
SELECT student_id, name
FROM students
WHERE birth_date IS NULL;
Kết quả:
| student_id | name |
|---|---|
| 2 | Anna Song |
| 4 | Maria Chi |
Bạn đã lấy được thông tin sinh viên chưa có ngày sinh.
Ví dụ dùng hàm để xử lý NULL
Ví dụ: tính tổng cuối cùng có xét đến NULL
Bảng đơn hàng lưu số tiền đơn hàng. Nhưng dữ liệu không phải lúc nào cũng đủ, nên cần tính trường hợp số tiền là 0 nếu bị thiếu.
Dữ liệu ví dụ:
| order_id | customer_name | order_amount |
|---|---|---|
| 1 | Alex | 1200 |
| 2 | Maria | 2500 |
| 3 | Max | NULL |
| 4 | Xena | 3100 |
Truy vấn:
SELECT SUM(COALESCE(order_amount, 0)) AS total_amount
FROM orders;
Kết quả:
| total_amount |
|---|
| 6800 |
Bạn dùng COALESCE(order_amount, 0) để thay NULL thành 0 trước khi cộng tổng. Như vậy sẽ tránh lỗi hoặc tính sai.
Ví dụ: hiển thị text thay cho NULL
| customer_name | order_amount |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | NULL |
| Xena | 3100 |
Trong báo cáo cần hiển thị text "Không có" cho mọi dữ liệu trống thay vì NULL.
SELECT
customer_name,
COALESCE(order_amount::TEXT, 'Không có') AS order_status
FROM orders;
Kết quả:
| customer_name | order_status |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | Không có |
| Xena | 3100 |
COALESCE() giúp bạn hiển thị text mong muốn nếu giá trị là NULL.
Tình huống phức tạp với NULL
| customer_name | order_amount |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | NULL |
| Xena | 3100 |
Bài toán là — sắp xếp đơn hàng sao cho đơn hàng không có số tiền nằm đầu, sau đó là giảm dần từ lớn đến nhỏ.
SELECT customer_name, order_amount
FROM orders
ORDER BY order_amount DESC NULLS FIRST;
Kết quả:
| customer_name | order_amount |
|---|---|
| Max | NULL |
| Xena | 3100 |
| Maria | 2500 |
| Alex | 1200 |
Ở đây bạn dùng NULLS FIRST để cho NULL lên trước các giá trị khác.
Ví dụ: lọc dữ liệu và thay thế giá trị NULL
| student_id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | NULL |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | NULL |
Trong một số báo cáo, bạn cần chỉ hiển thị dòng có giá trị hoặc thay thế bằng "Không rõ" nếu là NULL.
SELECT
student_id,
name,
COALESCE(birth_date::TEXT, 'Không rõ') AS birth_date_info
FROM students;
Kết quả:
| student_id | name | birth_date_info |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | Không rõ |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | Không rõ |
Cái này cực kỳ hữu ích khi làm báo cáo, vì bạn cần cho thấy dữ liệu bị thiếu.
Mẹo thực tế
Làm việc với NULL cần chú ý kỹ. Đây là vài tip hay ho:
- Dùng
IS NULLvàCOALESCE()để kiểm tra và thay thế giá trị thiếu. - Nhớ là hàm tổng hợp sẽ bỏ qua
NULL, trừCOUNT(*). - Khi sắp xếp nhớ dùng
NULLS FIRSTvàNULLS LAST. - Trong báo cáo nên ghi rõ bạn xử lý
NULLthế nào để tránh hiểu nhầm với đồng nghiệp.
Biết mấy cái này không chỉ giúp bạn viết truy vấn đúng mà còn gây ấn tượng khi phỏng vấn nữa. Vì xử lý dữ liệu thực tế luôn được đánh giá cao hơn lý thuyết suông mà!
GO TO FULL VERSION