Hàm CASE trong SQL Server (phần 1)
Trong SQL Sever, hàm CASE kiểm định giá trị dựa trên danh sách
điều kiện đưa ra, sau đó trả về một hoặc nhiều kết quả. Ở bài này
chúng i sminh hoạ một số cách dùng khác nhau của hàm này
trong những trường hợp khác nhau.
Phương thức 1: Cách dùng hàm CASE đơn giản
Đây là cách dùng phổ biến nhất của m case, trong đó bạn có thể tạo giá
trvô hưng dựa trên danh sách điều kiện đưa ra.
Gisử chúng ta có bảng sau với các cột id (mã số nhân viên), [First
name] (tên), [Last name] (họ) và gender (giới tính).y giờ, chúng ta
mun tạo thêm tiền tố (Mr, Ms) ở phía trước từng tên, dựa trên giá trị của
cột Gender, thực hiện như sau:
use tempdb
go
if exists (select * from dbo.sysobjects where id
= object_id(N'[emp]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [emp]
GO
create table Emp (id int, [First name]
varchar(50),
[Last name] varchar(50), gender char(1))
go
insert into Emp (id,[First name],[Last name],
gender )
values (1,'John','Smith','m')
insert into Emp (id,[First name],[Last name],
gender )
values (2,'James','Bond','m')
insert into Emp (id,[First name],[Last name],
gender )
values (3,'Alexa','Mantena','f')
insert into Emp (id,[First name],[Last name],
gender )
values (4,'Shui','Qui','f')
insert into Emp (id,[First name],[Last name],
gender )
values (5,'William','Hsu','m')
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
insert into Emp (id,[First name],[Last name],
gender )
values (6,'Danielle','Stewart','F')
insert into Emp (id,[First name],[Last name],
gender )
values (7,'Martha','Mcgrath','F')
insert into Emp (id,[First name],[Last name],
gender )
values (8,'Henry','Fayol','m')
insert into Emp (id,[First name],[Last name],
gender )
values (9,'Dick','Watson','m')
insert into Emp (id,[First name],[Last name],
gender )
values (10,'Helen','Foster','F')
go
Bây giờ, tạo cột [Full name] (họ tên đầy đủ) để xác định nên đặt tiền tố là
“Mr.” hay “Ms.”, da vào giá trị trên ct Gender.
Select [id],[Full Name] = case Gender
when 'm' then 'Mr. '+[First name]+ ' '+[Last
name]
when 'f' then 'Ms. '+[First name]+ ' '+[Last
name]
end
from Emp
Thủ tục này trả về kết quả như hình bên dưới:
id Full Name
----------- ----------------
1 Mr. John Smith
2 Mr. James Bond
3 Ms. Alexa Mantena
4 Ms. Shui Qui
5 Mr. William Hsu
6 Ms. Danielle Stewart
7 Ms. Martha Mcgrath
8 Mr. Henry Fayol
9 Mr. Dick Watson
10 Ms. Helen Foster
Phương thức 2: Sử dụng hàm case đơn giản với mệnh đề ELSE
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
Nếu thêm một hàng với giá trị NULL vào ct gender, bạn sẽ không thấy
có tên nào được trả về trong tập hợp kết quả.
Chèn hàng sau vào bảng emp:
use tempdb
go
insert into Emp (id,[First name],[Last name],
gender ) values (11,'Tom','Gabe',NULL)
go
Bây gitạo cột [Full name] để xác định tiền tố đặt trước mỗi tên là “Mr.”
hay “Ms.”, da trên giá trị lấycột Gender:
Select [id],[Full Name] = case Gender
when 'm' then 'Mr. '+[First name]+ ' '+[Last
name]
when 'f' then 'Ms. '+[First name]+ ' '+[Last
name]
end
from Emp
Kết qu trả về như sau:
id Full Name
----------- ------------------------
1 Mr. John Smith
2 Mr. James Bond
3 Ms. Alexa Mantena
4 Ms. Shui Qui
5 Mr. William Hsu
6 Ms. Danielle Stewart
7 Ms. Martha Mcgrath
8 Mr. Henry Fayol
9 Mr. Dick Watson
10 Ms. Helen Foster
11 NULL
Tuy nhiên, chúng ta cần hiển thị Full Name (họ tên đầy đủ) của nhân
viên, kể cả trong trường hợp không có giá trị trên Gender.
Để thực hiện điều này, bn cần dùng hàm CASE với mệnh đề ELSE.
Thc hiện truy vấn như sau:
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
Select [id],[Full Name] = case Gender
when 'm' then 'Mr. '+[First name]+ ' '+[Last
name]
when 'f' then 'Mz. '+[First name]+ ' '+[Last
name]
else [First name]+ ' '+[Last name]
end
from Emp
Kết quả trả về như sau:
id Full Name
----------- ----------------------
1 Mr. John Smith
2 Mr. James Bond
3 Mz. Alexa Mantena
4 Mz. Shui Qui
5 Mr. William Hsu
6 Mz. Danielle Stewart
7 Mz. Martha Mcgrath
8 Mr. Henry Fayol
9 Mr. Dick Watson
10 Mz. Helen Foster
11 Tom Gabe
Phương thức 3: Sử dụng hàm CASE khi có hai hoặc nhiều điều kiện
trong danh sách
Trong hai ví dtrên, bạn thấy rằng các điều kiện được xét đến hoặc là
Male, Female, hay None. Tuy nhiên, trong nhiều trường hợp bạn sẽ cần
sử dụng nhiều điều kiện, nhiều toán tử cùng lúc để trả về một giá trị.
Thêm cột [Marital Status] (tình trạng hôn nhân) vào bng update giá
trnhư bên dưới:
use tempdb
go
alter table Emp add [Marital Status] char(1) --
S-Single M-Married
go
Update Emp set [Marital Status]='S' where id in
(1,5,8)
Update Emp set [Marital Status]='M' where
[Marital Status] is NULL
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
Go
Gisử chúng ta muốn hiển thị tên nhân viên có tin tố đứng trước giúp dễ
dàng xác định tình trạng hôn nhân của h. Thực hiện truy vấn như sau:
Select [id],[Full Name] = case
when Gender ='m' and [marital status] ='S' then
'MR. '+[First name]+ ' '+[Last name]
when Gender ='m' and [marital status] ='M' then
'Mr. '+[First name]+ ' '+[Last name]
when Gender ='f' and [marital status] ='S' then
'Ms. '+[First name]+ ' '+[Last name]
when Gender ='f' and [marital status] ='M' then
'Mrs. '+[First name]+ ' '+[Last name]
else [First name]+ ' '+[Last name]
end
from Emp
Kết quả được trả về là:
id Full Name
----------- --------------------
1 MR. John Smith
2 Mr. James Bond
3 Mrs. Alexa Mantena
4 Mrs. Shui Qui
5 MR. William Hsu
6 Mrs. Danielle Stewart
7 Ms. Martha Mcgrath
8 MR. Henry Fayol
9 Mr. Dick Watson
10 Mrs. Helen Foster
11 Tom Gabe
Kết luận
Ở phần một này chúng ta đã thấy mt số ví dụ minh hoạ các cách s dụng
hàm CASE đơn giản trong truy vấn SQL. Trong phần 2 chúng ta sẽ tiếp
tục thảo luận ch sử dụng hàm CASE những trường hợp phức tạp.
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com