+1

CASE trong SQL

Bài viết này sẽ mang đến cho người đọc cách sử dụng biểu thức điều kiện CASE trong SQL. Nói sơ qua về SQL thì như mọi người cũng biết, nó là một ngôn ngữ giúp chúng ta có thể thao tác với cơ sở dữ liệu một cách thuận tiện hơn.

Như mỗi một ngôn ngữ lập trình hoàn chỉnh như Pascal, C/C++, Java,... ở chúng thì đều có cơ chế xử lí khối lênh điều khiển, hay còn gọi là câu lệnh rẽ nhánh (conditional statement). Tất cả các câu lệnh rẽ nhánh đó thì đều có một cấu trúc chung IF....THEN....ELSE....ENDIF. Nếu điều kiện theo sau lệnh IF là True, thì khối lệnh theo sau từ khóa THEN sẽ được thực thi, và ngược lại thì khối lệnh theo sau từ khóa ELSE sẽ được chạy. ENDIF sẽ là từ khóa báo hiệu cho chương trình dịch biết rằng đến đây là kết thúc của khối lệnh điều khiển và sẽ break (đây là phần liên quan đến ngôn ngữ hình thức cũng như là chương trình dịch, sau này nếu có cơ hội mình sẽ chia sẽ những gì mình biết về 2 cái này đến cho bạn đọc).

Ngoài câu lệnh rẽ nhánh như phía bên trên thì ở một vài ngôn ngữ còn có thêm câu lệnh như là CASE được dùng với mục đích tương tự như câu lệnh rẽ nhánh. SQL cũng cung cấp cho chúng ta CASE dưới 2 dạng là biểu thức và câu lệnh, điểm khác nhau của chúng là biểu thức CASE sẽ đánh giá trị, còn câu lệnh CASE sẽ thực thi khối lệnh.

  1. Sử dụng CASE với điều kiện search:

Nếu sử dụng CASE theo cách này, thì cú pháp sẽ như sau:

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    WHEN conditionn THEN resultn
    ELSE resultx
END

CASE sẽ kiểm tra điều kiện condition1, nếu condition1 là True thì biểu thức CASE sẽ nhận giá trị là result1, ngược lại condition1 là False thì CASE sẽ tính toán đánh giá dựa trên condition2. Nếu tất cả các condition đều không thỏa mãn thì biểu thức CASE sẽ nhận giá trị của ELSE đó là resultx. Câu lệnh ELSE ở đây chỉ là một tùy chọn, nếu trong trường hợp không có câu lệnh ELSE và không có condition nào thỏa mãn thì giá trị nhận được lúc này sẽ là null.

Ngoài ra CASE còn được sử dụng kết hợp với câu lệnh UPDATE, như ở ví dụ phía dưới, dựa vào điều kiện khác nhau mà giá trị bị update sẽ khác nhau

UPDATE TMP
    SET TEMP = CASE
            WHEN THRESH_HOLD < 1
                THEN ‘very trueWHEN THRESH_HOLD < 5
                THENtrueWHEN THRESH_HOLD < 20
                THENfalseWHEN THRESH_HOLD < 50
                THEN ‘very falseELSE ‘None’
        END ;
  1. Sử dụng CASE với nhiều giá trị

Nếu muốn so sánh một giá trị này với các giá trị khác. Bạn có thể sử dụng CASE theo cách như sau:

CASE valuet
    WHEN value1 THEN result1
    WHEN value2 THEN result2
    ...
    WHEN valuen THEN resultn
    ELSE resultx
END

Nếu giá trị kiểm tra (valuet) bằng với value1, biểu thức nhận giá trị result1. Nếu valuet không bằng value1 nhưng lại bằng value2, thì lúc này biểu thức sẽ nhận giá trị là result2. Biểu thức sẽ so sánh từng giá trị một cho đến value thứ n, trong trường hợp không có giá trị nào match thì biểu thức sẽ nhận giá trị resultx. Nếu không có tùy chọn ELSE thì biểu thức sẽ nhận giá trị null.

Để nắm rõ hơn về phần này, bạn đọc có thể xem thêm ví dụ sau, giả sử bây giờ bạn có một table chứa quân hàm và cấp bậc trong quân đội Mỹ. Nhiệm vụ bây giờ là list ra được các từ viết tắt ứng với từng cấp bậc, đoạn code phía dưới sẽ làm nhiệm vụ này

SELECT CASE RANK
        WHEN ‘general’ THEN ‘Gen.WHEN ‘colonel’ THEN ‘Col.WHEN ‘lieutenant colonel’ THEN ‘Lt. Col.WHEN ‘major’ THEN ‘Maj.WHEN ‘captain’ THEN ‘Capt.WHENfirst lieutenant’ THEN1st. Lt.WHENsecond lieutenant’ THEN2nd. Lt.ELSE ‘Mr.END,
        LAST_NAME
    FROM OFFICERS ;

Và nếu có kết quả thì nó sẽ có dạng như sau

Capt. AAA
Col. BBB
Gen. CCCC
Maj. DDDD
Mr. Nimitz // đây là tên của một vị đô đốc phục vụ cho lực lượng hải quân
Hoa Kỳ (US Navy) trong thế chiến thứ 2, rank của vị đô đốc này không được
liệt kê ở trong biểu thức CASE nên title của vị này sẽ được xác định bởi
câu lệnh ELSE 
  1. Một vài CASE đặc biệt NULLIF, COALESCE

NULLIF là phương pháp viết gọn lại của biểu thức CASE , thay vì phải viết

CASE Salary
    WHEN -1 THEN NULL
    ELSE Salary
END ;

thì có thể dùng NULLIF để gói gọn câu lệnh lại như sau :

UPDATE EMP
    SET Salary = NULLIF(Salary, -1) ;

ý nghĩa của nó như sau "Update Emp table, setting cột salary thành null nếu giá trị của salary là -1, trong trường hợp khác thì không đổi gì"

COALESCE cũng giống như NULLIF là phương pháp viết gọn lại của biểu thức CASE. COALESCE sẽ xử lí 1 list với các giá trị có thể null hoặc không null. Nếu trong list có một giá trị không null, biểu thức COALESCE sẽ nhận giá trị đó. Nếu có nhiều hơn 1 giá trị khác null thì COALESCE sẽ nhận giá trị không null đầu tiên trong list. Nếu tất cả giá trị trong list đều null thì biểu thức COALESCE sẽ nhận giá trị null

Thay vì phải viết biểu thức CASE như sau:

CASE
    WHEN value1 IS NOT NULL
        THEN value1
    WHEN value2 IS NOT NULL
        THEN value2
    ...
    WHEN valuen IS NOT NULL
        THEN valuen
    ELSE NULL
END

thì có thể ngắn gọn lại bằng cách dùng COALESCE

COALESCE(value1, value2, ..., valuen)

COALESCE có thể được dùng chung với phép toán OUTER JOIN (bài viết này sẽ không nói đến), nhưng trong ngữ cảnh này thì nó giúp giảm khá nhiều thao tác gõ phím...


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí