Lewati ke konten utama

Memahami Fungsi SQL DECODE()

Pelajari cara menggunakan DECODE() di Oracle untuk logika kondisional dalam transformasi data. Bandingkan DECODE() dengan pernyataan CASE WHEN dari sisi kinerja dan perilaku.
· 11 mnt Baca

Jelajahi bersama AI

Memahami cara menerapkan logika kondisional langsung di dalam kueri SQL adalah keterampilan yang diperlukan bagi data scientist dan data engineer. Tutorial ini memberikan panduan komprehensif untuk menggunakan fungsi SQL DECODE() di Oracle. Saya juga akan membandingkan DECODE() dengan CASE WHEN di Oracle dan membantu Anda memahami kapan harus menggunakan masing-masing fungsi. Terakhir, saya akan menyediakan kode untuk transformasi yang setara di SQL Server, PostgreSQL, dan MySQL. 

Sebelum melihat contoh praktisnya, saya merekomendasikan mengikuti kursus DataCamp Introduction to Oracle SQL untuk menyegarkan kembali keterampilan Anda menggunakan dialek PL/SQL. Selain itu, kursus Intermediate SQL akan membekali Anda dengan keterampilan SQL lanjutan yang diperlukan saat menangani kueri dengan fungsi DECODE() karena, seperti yang akan kita lihat, DECODE() sering digunakan dengan sintaks yang lebih lanjut, seperti subkueri.

Cara Menggunakan Fungsi SQL DECODE()

Fungsi SQL DECODE() didukung secara native di database Oracle dan tersedia dalam dialek PL/SQL. Fungsi DECODE() memungkinkan penerapan logika kondisional di dalam kueri. Teknik ini penting karena membantu transformasi data saat mengambil rekaman dari database.

Pertimbangkan tabel employees di bawah ini, di mana department_id memiliki nilai numerik. Sebagai gantinya, kita ingin department_id disebut department_name dan memiliki kategori yang lebih mudah dipahami.

Contoh tabel untuk ditransformasi menggunakan fungsi SQL DECODE()

Contoh tabel untuk ditransformasi menggunakan fungsi SQL DECODE(). Gambar oleh Penulis.

Contoh di bawah ini menunjukkan cara menggunakan fungsi DECODE() untuk mengubah department_id menjadi nama yang sebenarnya.

-- 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;

Contoh keluaran tabel yang ditransformasi menggunakan fungsi SQL DECODE()

Contoh tabel keluaran setelah menggunakan fungsi SQL DECODE(). Gambar oleh Penulis.

Memahami Fungsi SQL DECODE()

Fungsi DECODE() tersedia di database Oracle dan memungkinkan Anda mentransformasikan sebuah kolom menggunakan logika kondisional. Fungsi DECODE() memungkinkan beberapa transformasi kondisional menggunakan satu kueri sederhana.

Sintaks fungsi DECODE() ditunjukkan seperti di bawah ini:

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

Di mana:

  • expression: Nilai yang dibandingkan.

  • search: Nilai pembanding terhadap expression.

  • result: Nilai yang dikembalikan jika expression cocok dengan nilai search.

  • default: Nilai yang dikembalikan jika tidak ditemukan kecocokan (opsional).

Teknik Lanjutan dan Pertimbangan dengan Fungsi SQL DECODE()

Beberapa operasi SQL lanjutan dapat dilakukan menggunakan fungsi DECODE(). Teknik lanjutan ini memungkinkan transformasi logika kondisional yang lebih kompleks. 

DECODE() dengan fungsi agregat

Fungsi DECODE() di Oracle dapat digunakan dalam pernyataan SELECT untuk mengkategorikan ulang sebuah variabel, dan juga dapat digunakan dalam pernyataan SELECT bersama fungsi agregat untuk pengelompokan yang lebih rumit, yang semakin meningkatkan fleksibilitas dan interpretasi hasil. 

Dalam kueri berikut, kita menggunakan DECODE() untuk mengubah department_id menjadi department_name. Kita juga menggunakan DECODE() untuk mengategorikan rata-rata gaji menjadi ‘High Paying’ atau '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; 

Contoh keluaran tabel setelah menggunakan beberapa fungsi SQL DECODE()

Contoh keluaran tabel setelah menggunakan beberapa fungsi SQL DECODE(). Gambar oleh Penulis

Pernyataan DECODE() bertingkat (nested)

Menerapkan fungsi DECODE() dengan subkueri memungkinkan Anda melakukan transformasi logika kondisional yang canggih pada data. Pernyataan DECODE() bertingkat di Oracle membantu saat kita ingin mengevaluasi beberapa kondisi dalam sebuah tabel.

Pada contoh di bawah, kita menggunakan pernyataan DECODE() bertingkat untuk mengategorikan karyawan berdasarkan departemen dan gajinya.

-- 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;

Contoh keluaran tabel menggunakan pernyataan SQL DECODE() bertingkat di Oracle

Contoh keluaran tabel setelah menggunakan fungsi DECODE() bertingkat. Gambar oleh Penulis

Cara DECODE() menangani nilai NULL

Fungsi DECODE() juga menangani nilai NULL secara berbeda dalam dua cara. Pertama, DECODE() bertindak seolah-olah dua nilai NULL setara. Fungsionalitas ini berarti nilai NULL dianggap cocok saat membandingkan nilai kolom dengan NULL. Namun, Anda tetap harus mewaspadai hasil yang tidak terduga ketika NULL tidak diperhitungkan secara eksplisit, karena dapat menutupi nilai NULL selama transformasi.

Selain itu, perlu Anda ketahui bahwa, seperti halnya pernyataan CASE WHEN, fungsi DECODE() akan mengembalikan nilai NULL jika tidak ditemukan kecocokan.

Contoh di bawah ini menunjukkan bagaimana fungsi DECODE() mengembalikan nilai null ketika department_id dan salary tidak ada.

-- 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;

Contoh keluaran tabel menggunakan fungsi SQL DECODE() untuk menangani nilai NULL.

Contoh keluaran tabel setelah menggunakan DECODE() untuk menangani nilai NULL. Gambar oleh Penulis

DECODE vs. CASE WHEN di Oracle

Fungsi DECODE() adalah yang pertama diperkenalkan, dan meskipun kini telah digantikan oleh pernyataan CASE WHEN, fungsi ini masih disukai dalam beberapa konteks. Misalnya, sintaks fungsi DECODE() lebih sederhana, sehingga jika logikanya cukup sederhana, lebih mudah dibaca dan dipahami. 

Selain itu, fungsi DECODE() biasanya lebih cepat karena kinerjanya dioptimalkan sebagai fungsi bawaan, meskipun perbedaannya mungkin tidak signifikan. Terakhir, pada sistem Oracle lama, Anda mungkin harus menggunakan fungsi DECODE() sebagai fungsi bawaan. 

Alternatif DECODE() di Database Lain

Fungsi DECODE() hanya didukung di database Oracle. Namun, SQL Server, PostgreSQL, dan MySQL menyediakan metode alternatif untuk menerapkan logika transformasi data kondisional.

Fungsi DECODE() berguna dalam transformasi data karena menyederhanakan logika yang kompleks dengan menghilangkan penggunaan pernyataan IF ELSE atau CASE. Fungsi DECODE() juga meningkatkan keterbacaan kueri, memungkinkan manipulasi data yang efisien. Mari kita telaah berbagai kasus penggunaan fungsi DECODE().

Menggunakan CASE WHEN di SQL Server, PostgreSQL, dan MySQL

Pernyataan CASE WHEN menyediakan alternatif untuk fungsi DECODE() guna melakukan transformasi logika kondisional di SQL. Sintaks dan implementasi CASE WHEN konsisten di database SQL Server, PostgreSQL, dan MySQL.

Contoh di bawah ini menunjukkan cara menggunakan pernyataan CASE WHEN untuk mentransformasi data di dalam pernyataan SELECT. Kueri ini juga menunjukkan cara menggabungkan pernyataan CASE WHEN dengan fungsi SQL lain untuk transformasi kondisional yang kompleks.

 -- 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   

Kesimpulan dan Pembelajaran Lanjutan

Memahami fungsi DECODE() di Oracle penting saat mempelajari cara mentransformasi data secara efektif. Fungsi DECODE() menawarkan berbagai kasus penggunaan untuk menerapkan logika kondisional selama transformasi data. Penting juga untuk mempelajari alternatif transformasi kondisional di database SQL Server, PostgreSQL, dan MySQL. Saya mendorong Anda untuk mempraktikkan fungsi DECODE() menggunakan berbagai dataset dan kasus penggunaan untuk menyempurnakan keterampilan transformasi data Anda.

Jika Anda ingin meningkatkan keterampilan analisis data, saya merekomendasikan mengikuti kursus DataCamp Reporting in SQL untuk membangun keterampilan analisis dan presentasi Anda. Demikian pula, Anda sebaiknya melihat career track Associate Data Analyst in SQL kami untuk membantu Anda menjaga kemajuan keterampilan SQL yang diperlukan dalam karier sebagai analis data. Terakhir, saya sangat merekomendasikan proyek DataCamp Data-Driven Decision Making in SQL untuk menunjukkan penguasaan Anda dalam menggunakan berbagai teknik SQL untuk analisis dan pelaporan agar menonjol di antara analis data lainnya.

Allan Ouko

Penulis

Allan Ouko

Penulis teknis Data Science dengan pengalaman langsung dalam analitik data, business intelligence, dan data science. Saya menulis konten praktis berfokus industri tentang SQL, Python, Power BI, Databricks, dan rekayasa data, yang berakar pada pekerjaan analitik dunia nyata. Tulisan saya menjembatani kedalaman teknis dan dampak bisnis, membantu para profesional mengubah data menjadi keputusan yang meyakinkan.

Pertanyaan yang Sering Diajukan

Apa itu fungsi SQL DECODE()?

SQL DECODE() adalah fungsi yang digunakan untuk menjalankan logika kondisional dalam transformasi data.

Database mana yang mendukung fungsi SQL DECODE()?

Hanya database Oracle yang mendukung fungsi SQL DECODE() secara native. SQL Server, PostgreSQL, dan MySQL memungkinkan transformasi kondisional menggunakan pernyataan CASE WHEN.

Bisakah saya menggunakan DECODE() dengan fungsi SQL lainnya?

Fungsi Oracle DECODE() dapat digunakan bersama fungsi SQL lainnya, seperti AVG(), SUM(), dan COUNT() untuk melakukan transformasi kondisional tingkat lanjut.

Apakah saya bisa menggunakan pernyataan DECODE() bertingkat?

Database Oracle mendukung pernyataan DECODE() bertingkat untuk logika yang kompleks. Namun, pernyataan DECODE() bertingkat yang panjang dapat menjadi sulit untuk dirawat dan dibaca.

Bisakah fungsi DECODE() menangani nilai NULL?

Fungsi DECODE() menangani nilai NULL sebagai default dan akan mengembalikan nilai NULL jika kondisinya tidak terpenuhi selama transformasi data.

Selain DECODE(), fungsi apa lagi yang unik di Oracle?

Fungsi lain yang unik di database Oracle termasuk NVL(), yang mengganti nilai NULL dengan nilai yang ditentukan.

Topik

Terkait

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

blogs

Spaghetti Plot dan Jalur Badai

blogs

Tutorial Korelasi di R