Trong hướng dẫn này, bạn sẽ học cách sử dụng biểu thức CASE
, COALESCE
và NULLIF
trong SQL Server.
Biểu thức CASE
trong SQL Server đánh giá danh sách các điều kiện và trả về một trong nhiều kết quả được chỉ định. Biểu thức CASE
có hai dạng: biểu thức CASE
và biểu thức CASE
tìm kiếm. Cả hai dạng biểu thức CASE
đều hỗ trợ một câu lệnh ELSE
tùy chọn.
Bởi vì CASE là một biểu thức, bạn có thể sử dụng nó trong bất kỳ mệnh đề chấp nhận một biểu thức như SELECT
, WHERE
, GROUP BY
và HAVING
.
Sau đây là cú pháp của biểu thức CASE
đơn giản:
CASE input
WHEN e1 THEN r1
WHEN e2 THEN r2
...
WHEN en THEN rn
[ ELSE re ]
END
Biểu thức CASE
đơn giản so sánh biểu thức đầu vào (input
) với biểu thức (ei
) trong mỗi mệnh đề WHEN
có bằng nhau không. Nếu biểu thức đầu vào bằng một biểu thức (ei
) trong mệnh đề WHEN
, thì kết quả (ri
) trong mệnh đề THEN
tương ứng được trả về.
Nếu biểu thức đầu vào không bằng bất kỳ biểu thức nào và có sẵn mệnh đềELSE
, biểu thức CASE
sẽ trả về kết quả trong mệnh đề ELSE
(re
).
Trong trường hợp mệnh đề ELSE
bị bỏ qua và biểu thức đầu vào không bằng bất kỳ biểu thức nào trong mệnh đề WHEN
, biểu thức CASE
sẽ trả về NULL.
Xem bảng sales.orders
sau từ cơ sở dữ liệu mẫu:
Ví dụ này sử dụng hàm COUNT()
với mệnh đề GROUP BY
để trả về số đơn đặt hàng cho từng trạng thái của đơn đặt hàng:
SELECT
order_status,
COUNT(order_id) order_count
FROM
sales.orders
WHERE
YEAR(order_date) = 2018
GROUP BY
order_status;
Đây là đầu ra:
Các giá trị trong cột order_status
là số, không có ý nghĩa trong trường hợp này. Để làm cho đầu ra dễ hiểu hơn, bạn có thể sử dụng biểu thức CASE
đơn giản như được hiển thị trong truy vấn sau:
SELECT
CASE order_status
WHEN 1 THEN 'Pending'
WHEN 2 THEN 'Processing'
WHEN 3 THEN 'Rejected'
WHEN 4 THEN 'Completed'
END AS order_status,
COUNT(order_id) order_count
FROM
sales.orders
WHERE
YEAR(order_date) = 2018
GROUP BY
order_status;
Hình ảnh sau đây cho thấy kết quả đầu ra:
Xem truy vấn sau:
SELECT
SUM(CASE
WHEN order_status = 1
THEN 1
ELSE 0
END) AS 'Pending',
SUM(CASE
WHEN order_status = 2
THEN 1
ELSE 0
END) AS 'Processing',
SUM(CASE
WHEN order_status = 3
THEN 1
ELSE 0
END) AS 'Rejected',
SUM(CASE
WHEN order_status = 4
THEN 1
ELSE 0
END) AS 'Completed',
COUNT(*) AS Total
FROM
sales.orders
WHERE
YEAR(order_date) = 2018;
Đây là đầu ra:
Bạn có thể xem chi tiết về biểu thức CASE
trong SQL Server ở bài viết sau:
Biểu thức COALESCE
trong SQL Server chấp nhận một tập các đối số, đánh giá chúng theo trình tự và trả về đối số không rỗng đầu tiên.
Sau đây minh họa cú pháp của biểu thức COALESCE
:
COALESCE(e1,[e2,...,en])
Trong cú pháp này, e1, e2,… en là các biểu thức vô hướng trả về các giá trị vô hướng (scalar value). Biểu thức COALESCE
trả về biểu thức không NULL đầu tiên. Nếu tất cả các biểu thức đánh giá là NULL, thì biểu thức COALESCE
trả về NULL;
Bởi vì COALESCE
là một biểu thức, bạn có thể sử dụng nó trong bất kỳ mệnh đề chấp nhận một biểu thức như SELECT
, WHERE
, GROUP BY
và HAVING
.
Hãy xem các ví dụ thực tế về việc sử dụng biểu thức COALESCE
:
Ví dụ sau sử dụng biểu thức COALESCE
để trả về chuỗi 'Hi'
vì nó là đối số không rỗng đầu tiên:
SELECT
COALESCE(NULL, 'Hi', 'Hello', NULL) result;
Đây là đầu ra:
result
------
Hi
(1 row affected)
Ví dụ này sử dụng biểu thức COALESCE
để đánh giá danh sách các đối số và trả về số đầu tiên:
SELECT
COALESCE(NULL, NULL, 100, 200) result;
Kết quả như sau:
result
-----------
100
(1 row affected)
Xem bảng sales.customers
sau từ cơ sở dữ liệu mẫu.
Truy vấn sau trả về tên, họ, điện thoại và email của tất cả khách hàng:
SELECT
first_name,
last_name,
phone,
email
FROM
sales.customers
ORDER BY
first_name,
last_name;
Đây là kết quả một phần:
Cột phone
sẽ có giá trị NULL
nếu khách hàng không có số điện thoại ghi trong bảng sales.customers
.
Để làm cho đầu ra thân thiện hơn với doanh nghiệp, bạn có thể sử dụng biểu thức COALESCE
để thay thế giá trị NULL
bằng chuỗi N/A
(không có sẵn) như được hiển thị trong truy vấn sau:
SELECT
first_name,
last_name,
COALESCE(phone,'N/A') phone,
email
FROM
sales.customers
ORDER BY
first_name,
last_name;
Hình ảnh sau đây cho thấy đầu ra một phần:
Bạn có thể xem thêm về biểu thức COALESCE trong SQL Server ở bài viết sau:
Biểu thức NULLIF
chấp nhận hai đối số và trả về NULL
nếu hai đối số bằng nhau. Nếu không, nó trả về biểu thức đầu tiên.
Sau đây là cú pháp của biểu thức NULLIF
:
NULLIF(expression1, expression2)
Trong cú pháp này, expression1
và expression2
là các biểu thức vô hướng. Nó có nghĩa là mỗi biểu thức trong số chúng trả về một giá trị vô hướng (scalar value).
Chúng tôi khuyên bạn không nên sử dụng các hàm phụ thuộc vào thời gian như hàm RAND()
trong biểu thức NULLIF
. Bởi vì điều này có thể khiến biểu thức được đánh giá hai lần và mang lại kết quả khác nhau từ hai lần gọi hàm.
Hãy lấy một số ví dụ về việc sử dụng biểu thức NULLIF
trong SQL Server.
Ví dụ này trả về NULL
vì đối số đầu tiên bằng đối số thứ hai:
SELECT
NULLIF(10, 10) result;
Đây là đầu ra:
result
------
NULL
(1 row affected)
Tuy nhiên, ví dụ sau trả về đối số đầu tiên vì hai đối số không bằng nhau:
SELECT
NULLIF(20, 10) result;
Kết quả như sau:
result
------
20
(1 row affected)
Ví dụ sau sử dụng biểu thức NULLIF
. Nó trả về NULL vì chuỗi đầu tiên bằng chuỗi thứ hai:
SELECT
NULLIF('Hello', 'Hello') result;
Đây là đầu ra:
result
------
NULL
(1 row affected)
Ví dụ này trả về đối số đầu tiên vì cả hai đối số không giống nhau:
SELECT
NULLIF('Hello', 'Hi') result;
Sau đây là kết quả đầu ra:
result
------
Hello
(1 row affected)
Bạn có thể xem chi tiết về biểu thức NULLIF trong SQL Server ở bài viết sau:
Trong hướng dẫn này, bạn đã học cách sử dụng biểu thức CASE
, COALESCE
và NULLIF
trong SQL Server.
Bạn có thể vui lòng tắt trình chặn quảng cáo ❤️ để hỗ trợ chúng tôi duy trì hoạt động của trang web.
Trong hướng dẫn này, bạn sẽ tìm hiểu về GUID trong SQL Server và cách sử dụng hàm NEWID() để tạo giá trị GUID.
Trong hướng dẫn này, bạn sẽ học cách sử dụng kiểu dữ liệu DATETIMEOFFSET trong SQL Server để thao tác datetime với múi giờ.
Trong hướng dẫn này, bạn sẽ học cách lưu trữ thời gian trong ngày trong cơ sở dữ liệu bằng cách sử dụng kiểu dữ liệu TIME trong SQL Server.
Trong hướng dẫn này, bạn sẽ học cách sử dụng kiểu dữ liệu DATE trong SQL Server để lưu trữ dữ liệu ngày tháng trong một bảng.