Chuyển đến nội dung chính

Tìm hiểu hàm SQL DECODE()

Tìm hiểu cách dùng DECODE() trong Oracle để xử lý logic điều kiện khi biến đổi dữ liệu. So sánh DECODE() với câu lệnh CASE WHEN về hiệu năng và hành vi.
· 11 phút đọc

Khám phá cùng AI

Nắm vững cách triển khai logic điều kiện trực tiếp trong câu truy vấn SQL là kỹ năng cần thiết cho nhà khoa học dữ liệu và kỹ sư dữ liệu. Hướng dẫn này cung cấp chỉ dẫn toàn diện về cách dùng hàm SQL DECODE() trong Oracle. Tôi cũng sẽ so sánh DECODE() với CASE WHEN trong Oracle và giúp bạn hiểu khi nào nên dùng mỗi hàm. Cuối cùng, tôi sẽ cung cấp mã cho các phép biến đổi tương đương trong SQL Server, PostgreSQL và MySQL. 

Trước khi đi vào ví dụ thực tế, tôi khuyến nghị bạn học khóa Introduction to Oracle SQL của DataCamp để ôn lại kỹ năng với phương ngữ PL/SQL. Ngoài ra, khóa Intermediate SQL sẽ trang bị cho bạn các kỹ năng SQL nâng cao cần thiết khi xử lý truy vấn có dùng DECODE() vì như chúng ta sẽ thấy, DECODE() thường được dùng cùng cú pháp nâng cao hơn như truy vấn con.

Cách sử dụng hàm SQL DECODE()

Hàm SQL DECODE() được hỗ trợ nguyên bản trong cơ sở dữ liệu Oracle và có sẵn trong phương ngữ PL/SQL. Hàm DECODE() cho phép triển khai logic điều kiện ngay trong câu truy vấn. Kỹ thuật này quan trọng vì giúp biến đổi dữ liệu khi truy xuất bản ghi từ cơ sở dữ liệu.

Xét bảng employees dưới đây, trong đó department_id có giá trị số. Thay vào đó, chúng ta muốn gọi department_id là department_name và có các danh mục dễ hiểu hơn.

Example table to transform using SQL DECODE() function

Bảng ví dụ để biến đổi bằng hàm SQL DECODE(). Hình: Tác giả.

Ví dụ dưới đây cho thấy cách dùng hàm DECODE() để chuyển department_id thành tên thực tế.

-- Using DECODE to transform department_id to department_name
SELECT 
    employee_id,
    first_name,
    last_name,
    DECODE(department_id, 
        1, 'IT', 
        2, 'HR', 
        3, 'Finance', 
        4, 'Marketing', 
        5, 'Sales', 
        'Unknown') AS department_name,
    salary,
    hire_date,
    city
FROM employees;

Example output of table transformed using SQL DECODE() function

Bảng kết quả ví dụ sau khi sử dụng hàm SQL DECODE(). Hình: Tác giả.

Tìm hiểu hàm SQL DECODE()

Hàm DECODE() có sẵn trong cơ sở dữ liệu Oracle và cho phép bạn biến đổi một cột bằng logic điều kiện. Hàm DECODE() cho phép thực hiện nhiều phép biến đổi có điều kiện chỉ trong một câu truy vấn đơn giản.

Cú pháp của hàm DECODE() như sau:

DECODE(expression, search1, result1, search2, result2, ..., default)

Trong đó:

  • expression: Giá trị cần so sánh.

  • search: Giá trị để so sánh với biểu thức.

  • result: Giá trị trả về nếu biểu thức khớp với giá trị tìm kiếm.

  • default: Giá trị trả về nếu không tìm thấy khớp (tùy chọn).

Kỹ thuật nâng cao và lưu ý với hàm SQL DECODE()

Một số thao tác SQL nâng cao có thể được thực hiện bằng hàm DECODE(). Các kỹ thuật nâng cao cho phép biến đổi logic điều kiện phức tạp hơn. 

DECODE() với các hàm tổng hợp

Hàm DECODE() trong Oracle có thể dùng trong mệnh đề SELECT để phân loại lại một biến, và cũng có thể dùng trong SELECT cùng các hàm tổng hợp để nhóm phức tạp hơn, từ đó tăng tính linh hoạt và khả năng diễn giải kết quả. 

Trong truy vấn sau, chúng ta dùng DECODE() để chuyển department_id thành department_name. Chúng ta cũng dùng DECODE() để phân loại mức lương trung bình thành ‘High Paying’ hoặc 'Low Paying'.

SELECT 
    department_id,
    
    -- Use DECODE to transform department_id into department_name
    DECODE(
        department_id,
        1, 'IT', 
        2, 'HR', 
        3, 'Finance', 
        4, 'Marketing', 
        5, 'Sales', 
        'Unknown'
    ) AS department_name,
    
    SUM(salary) AS total_salary, 
    
    -- Calculate the average salary for each department and round to nearest integer
    ROUND(AVG(salary), 0) AS average_salary,
    
    -- Use DECODE to categorize average salary into 'High Paying' or 'Low Paying'
    DECODE(
        SIGN(AVG(salary) - 65000), 
        1, 'High Paying', 
        0, 'High Paying', 
        -1, 'Low Paying' 
    ) AS salary_category
FROM 
    employees
GROUP BY 
    department_id; 

Example table output after using multiple SQL DECODE() functions

Bảng kết quả ví dụ sau khi dùng nhiều hàm SQL DECODE(). Hình: Tác giả

Lồng các câu lệnh DECODE()

Triển khai hàm DECODE() với truy vấn con cho phép bạn thực hiện các phép biến đổi logic điều kiện tinh vi trên dữ liệu. Câu lệnh DECODE() lồng nhau trong Oracle hữu ích khi chúng ta muốn đánh giá nhiều điều kiện trong một bảng.

Trong ví dụ dưới đây, chúng tôi sử dụng câu lệnh DECODE() lồng nhau để phân loại nhân viên dựa trên phòng ban và mức lương.

-- Select the columns
SELECT 
    employee_id,
    first_name, 
    last_name, 
    department_id,
    salary, 
    
    -- Use DECODE to categorize salary based on department and salary thresholds
    DECODE(department_id,
        
        1, DECODE( -- If department_id is 1 (IT)
            CASE 
                WHEN salary > 65000 THEN 'High' 
                ELSE 'Low' 
            END, 
            'High', 'IT High Salary', 
            'Low', 'IT Low Salary' 
        ),
        
        2, DECODE( -- If department_id is 2 (HR)
            CASE 
                WHEN salary > 55000 THEN 'High'
                ELSE 'Low' 
            END, 
            'High', 'HR High Salary', 
            'Low', 'HR Low Salary' 
        ),
        
        3, DECODE( -- If department_id is 3 (Finance)
            CASE 
                WHEN salary > 70000 THEN 'High' 
                ELSE 'Low' 
            END, 
            'High', 'Finance High Salary', 
            'Low', 'Finance Low Salary' 
        ),
        
        4, DECODE( -- If department_id is 4 (Marketing)
            CASE 
                WHEN salary > 68000 THEN 'High'
                ELSE 'Low' 
            END, 
            'High', 'Marketing High Salary', 
            'Low', 'Marketing Low Salary' 
        ),
        
        5, DECODE( -- If department_id is 5 (Sales)
            CASE 
                WHEN salary > 60000 THEN 'High' 
                ELSE 'Low'  
            END, 
            'High', 'Sales High Salary', 
            'Low', 'Sales Low Salary'
        ),
        
        'Unknown Department' -- Default value if department_id does not match any case
    ) AS salary_category
FROM 
    employees;

Example table output of using SQL nested DECODE() statement in Oracle

Bảng kết quả ví dụ sau khi dùng hàm DECODE() lồng nhau. Hình: Tác giả

Cách DECODE() xử lý giá trị NULL

Hàm DECODE() cũng xử lý giá trị NULL theo hai cách khác nhau. Một mặt, DECODE() coi như hai giá trị NULL là tương đương. Điều này có nghĩa là các giá trị NULL được xem là khớp khi so sánh giá trị cột với NULL. Tuy vậy, bạn nên lưu ý các kết quả ngoài dự kiến khi NULL không được xét đến một cách tường minh, vì nó có thể che khuất các giá trị NULL trong quá trình biến đổi.

Ngoài ra, bạn cần biết rằng, giống như câu lệnh CASE WHEN, hàm DECODE() sẽ trả về giá trị NULL nếu không tìm thấy khớp.

Ví dụ dưới đây cho thấy cách hàm DECODE() trả về giá trị null khi department_id và salary bị thiếu.

-- Select columns
SELECT 
    employee_id,
    first_name,
    last_name, 
    department_id, 
    salary, 
    -- Determine the salary category based on the salary value
    DECODE(salary, 
        NULL, 'No Salary Information',
        60000, 'Standard Salary',
        'Other Salary') AS salary_category, 
    -- Determine the department name based on the department ID
    DECODE(department_id, 
        1, 'IT',
        2, 'HR',
        3, 'Finance',
        4, 'Marketing',
        5, 'Sales') AS department_name 
        -- If department_id does not match any of the above, return NULL
FROM 
    employees;

Example table output using SQL DECODE() function to handle NULL values.

Bảng kết quả ví dụ sau khi dùng DECODE() để xử lý giá trị NULL. Hình: Tác giả

DECODE so với CASE WHEN trong Oracle

Hàm DECODE() được giới thiệu đầu tiên, và dù đã được thay thế bởi câu lệnh CASE WHEN, nó vẫn được ưa dùng trong một số ngữ cảnh. Chẳng hạn, cú pháp của DECODE() đơn giản hơn, nên nếu logic khá đơn giản, nó dễ đọc và dễ hiểu hơn. 

Ngoài ra, DECODE() thường nhanh hơn vì hiệu năng của nó được tối ưu như một hàm dựng sẵn, dù chênh lệch có thể không đáng kể. Cuối cùng, trong các hệ thống Oracle cũ, bạn có thể phải dùng DECODE() như một hàm dựng sẵn. 

Các lựa chọn thay thế DECODE() trong những hệ quản trị khác

Hàm DECODE() chỉ được hỗ trợ trong cơ sở dữ liệu Oracle. Tuy nhiên, SQL Server, PostgreSQL và MySQL cung cấp các phương thức thay thế để áp dụng logic biến đổi dữ liệu có điều kiện.

Hàm DECODE() hữu ích trong biến đổi dữ liệu vì đơn giản hóa logic phức tạp bằng cách loại bỏ việc dùng câu lệnh IF ELSE hoặc CASE. Hàm DECODE() cũng cải thiện khả năng đọc của truy vấn, cho phép thao tác dữ liệu hiệu quả. Hãy cùng xem các trường hợp sử dụng khác nhau của DECODE().

Dùng CASE WHEN trong SQL Server, PostgreSQL và MySQL

Câu lệnh CASE WHEN là lựa chọn thay thế cho hàm DECODE() để thực hiện biến đổi logic điều kiện trong SQL. Cú pháp và cách triển khai CASE WHEN nhất quán trên các cơ sở dữ liệu SQL Server, PostgreSQL và MySQL.

Ví dụ dưới đây cho thấy cách dùng câu lệnh CASE WHEN để biến đổi dữ liệu trong mệnh đề SELECT. Truy vấn cũng minh họa cách kết hợp CASE WHEN với các hàm SQL khác cho biến đổi điều kiện phức tạp.

 -- Select department ID
SELECT 
    department_id,
    
    -- Use CASE to transform department_id into department_name
    CASE 
        WHEN department_id = 1 THEN 'IT'
        WHEN department_id = 2 THEN 'HR'
        WHEN department_id = 3 THEN 'Finance'
        WHEN department_id = 4 THEN 'Marketing'
        WHEN department_id = 5 THEN 'Sales'
        ELSE 'Unknown' 
    END AS department_name,
    
    SUM(salary) AS total_salary,
    
    -- Calculate the average salary for each department and round to the nearest whole number
    ROUND(AVG(salary), 0) AS average_salary,
    
    -- Use CASE to categorize average salary into 'High Paying' or 'Low Paying'
    CASE 
        WHEN AVG(salary) > 65000 THEN 'High Paying'
        ELSE 'Low Paying' 
    END AS salary_category
FROM 
    employees
GROUP BY 
    department_id; -- Group results by department ID   

Kết luận và Học thêm

Hiểu rõ hàm DECODE() trong Oracle rất quan trọng khi học cách biến đổi dữ liệu hiệu quả. Hàm DECODE() cung cấp nhiều trường hợp sử dụng để áp dụng logic điều kiện trong quá trình biến đổi dữ liệu. Đồng thời, bạn cũng nên học các phương án biến đổi điều kiện thay thế trong SQL Server, PostgreSQL và MySQL. Tôi khuyến khích bạn luyện tập hàm DECODE() với các bộ dữ liệu và tình huống khác nhau để hoàn thiện kỹ năng biến đổi dữ liệu.

Nếu bạn muốn nâng cao kỹ năng phân tích dữ liệu, tôi khuyến nghị học khóa Reporting in SQL của DataCamp để củng cố kỹ năng phân tích và trình bày. Tương tự, bạn nên xem lộ trình nghề nghiệp Associate Data Analyst in SQL để duy trì tiến độ các kiến thức SQL cần thiết cho sự nghiệp phân tích dữ liệu. Cuối cùng, tôi đặc biệt khuyến nghị dự án Data-Driven Decision Making in SQL của DataCamp để bạn thể hiện khả năng vận dụng các kỹ thuật SQL khác nhau cho phân tích và báo cáo, giúp bạn nổi bật giữa các nhà phân tích dữ liệu khác.

Allan Ouko

Tác giả

Allan Ouko

Biên tập viên kỹ thuật về Khoa học dữ liệu với kinh nghiệm thực tế trong phân tích dữ liệu, trí tuệ doanh nghiệp và khoa học dữ liệu. Tôi viết nội dung thực tiễn, tập trung vào ngành về SQL, Python, Power BI, Databricks và kỹ thuật dữ liệu, dựa trên công việc phân tích trong thế giới thực. Bài viết của tôi kết nối chiều sâu kỹ thuật với tác động kinh doanh, giúp các chuyên gia chuyển đổi dữ liệu thành những quyết định vững chắc.

Câu hỏi thường gặp

Hàm SQL DECODE() là gì?

SQL DECODE() là một hàm dùng để thực hiện logic điều kiện phục vụ biến đổi dữ liệu.

Những cơ sở dữ liệu nào hỗ trợ hàm SQL DECODE()?

Chỉ cơ sở dữ liệu Oracle hỗ trợ nguyên bản hàm SQL DECODE(). SQL Server, PostgreSQL và MySQL cho phép biến đổi có điều kiện bằng câu lệnh CASE WHEN.

Tôi có thể dùng DECODE() với các hàm SQL khác không?

Hàm DECODE() trong Oracle có thể dùng cùng các hàm SQL khác như AVG(), SUM() và COUNT() để thực hiện các biến đổi điều kiện nâng cao.

Tôi có thể dùng các câu lệnh DECODE() lồng nhau không?

Cơ sở dữ liệu Oracle hỗ trợ lồng các câu lệnh DECODE() cho logic phức tạp. Tuy nhiên, các câu lệnh DECODE() lồng quá dài có thể khó bảo trì và khó đọc.

Hàm DECODE() có xử lý được giá trị NULL không?

Hàm DECODE() xử lý giá trị NULL theo mặc định và sẽ trả về NULL nếu điều kiện không được thỏa mãn trong quá trình biến đổi dữ liệu.

Ngoài DECODE(), còn những hàm nào là đặc thù của Oracle?

Các hàm khác đặc thù của Oracle bao gồm NVL(), dùng để thay thế các giá trị NULL bằng giá trị chỉ định.

Chủ đề

Liên quan