PostgreSQL 7 minute read

Hai semuanya, di materi kali ini kita akan membahas tentang Conditional Expression Seperti biasa karena materinya akan lumayan panjang jadi kita bagi jadi beberapa bagian diantaranya:

  1. What is Conditional Expression?
  2. CASE-WHEN expression
  3. Using CASE-WHEN-ELSE expression
  4. Using Nested CASE-WHEN expression
  5. Using CASE-WHEN expression in WHERE clause

Ok langsung aja kita bahas materi yang pertama

What is Conditional Expression?

Conditional statements/Expression in the SQL help you to define different logics and actions for different conditions. It allows you to perform different actions based on conditions defined within the statement. In real life, you perform many actions dependent on the outcome of some other activity or situation.

Some real-time examples of SQL case statement are:

  1. If it rains tomorrow, I will plan on a road trip.
  2. If flight tickets are less than $400 from my city, then I will go on vacation in Europe, else I will prefer some nearby tourist spot.

Di PostgreSQL, kita bisa menggunakan Conditional Statement/Expression dengan beberapa cara

  1. Case-When
  2. Coalesce
  3. NullIF
  4. Greatest or Least

Karena untuk function Coalesce, NullIF sudah pernah kita bahas di artikel sebelumnya jadi kita akan bahas lebih detail untuk Case-When expressionnya.

Using CASE-WHEN expression

The SQL CASE expression is a generic conditional expression, similar to if/else statements in other programming languages:

CASE WHEN condition THEN result
     [WHEN ...]
     [ELSE result]
END

CASE clauses can be used wherever an expression is valid. Each condition is an expression that returns a boolean result. If the condition’s result is true, the value of the CASE expression is the result that follows the condition, and the remainder of the CASE expression is not processed. If the condition’s result is not true, any subsequent WHEN clauses are examined in the same manner. If no WHEN condition yields true, the value of the CASE expression is the result of the ELSE clause. If the ELSE clause is omitted and no condition is true, the result is null.

Jika kita gambarkan secara diagram flowchart seperti berikut:

flowchart LR data --> condition1{ Condition } condition1 -- true --> conditionOk[ return OK ] condition1 -- false --> End[ return null ]

Berikut adalah contoh penggunaan dalam SQL:

Jika dijalankan hasilnya seperti berikut:

hr=# select employee_id    as kode_karyawan,
       commission_pct as besar_komisi,
       case
           when commission_pct is null
               then 'Tidak memiliki komisi'
           end
from employees;
 kode_karyawan | besar_komisi |         case          
---------------+--------------+-----------------------
           100 |              | Tidak memiliki komisi
           101 |              | Tidak memiliki komisi
           102 |              | Tidak memiliki komisi
           103 |              | Tidak memiliki komisi
           104 |              | Tidak memiliki komisi
           105 |              | Tidak memiliki komisi
           145 |         0.40 | 
           146 |         0.30 | 
           147 |         0.30 | 
           148 |         0.30 | 
           149 |         0.20 | 
           150 |         0.30 | 
           151 |         0.25 | 
           152 |         0.25 | 

(107 rows)

Using CASE-WHEN-ELSE expression

Selanjutnya kita akan membahas, CASE-WHEN-ELSE expression seperti berikut klo kita gambarkan secara diagram flowchart nya:

flowchart LR data --> condition1{ Condition } condition1 -- true --> conditionOk[ return OK ] condition1 -- false --> condition2{ More Condition } condition2 -- true --> conditionOk[ return OK ] condition2 -- else --> End[ return Something ]

Jadi disini kita memiliki lebih dari 2 kondisi, dimana ke dua kondisi tersebut memiliki nilai return OK sedangkan selain itu (else) return something. Berikut implementasi pada query sql:

Jika dijalankan hasilnya seperti berikut:

hr=# select employee_id    as kode_karyawan,
hr-#        commission_pct as besar_komisi,
hr-#        case
hr-#            when commission_pct is null
hr-#                then 'Tidak memiliki komisi'
hr-#            when commission_pct >= 0.2
hr-#                then 'Memiki komisi lebih besar dari 20%'
hr-#            else 'Memiliki komisi lebih kecil dari 10%'
hr-#            end
hr-# from employees
hr-# limit 50;
 kode_karyawan | besar_komisi |                case                
---------------+--------------+------------------------------------
           100 |              | Tidak memiliki komisi
           101 |              | Tidak memiliki komisi
           102 |              | Tidak memiliki komisi
           103 |              | Tidak memiliki komisi
           104 |              | Tidak memiliki komisi
           144 |              | Tidak memiliki komisi
           145 |         0.40 | Memiki komisi lebih besar dari 20%
           146 |         0.30 | Memiki komisi lebih besar dari 20%
           147 |         0.30 | Memiki komisi lebih besar dari 20%
           148 |         0.30 | Memiki komisi lebih besar dari 20%
           149 |         0.20 | Memiki komisi lebih besar dari 20%
(50 rows)

Using Nested CASE-WHEN expression

Selanjutnya kita akan membahas, Nested CASE-WHEN expression. Sama halnya seperti bahasa pemograman kita juga bisa menggunakan percabangan dalam percabangan atau istilah kerennya Nested Condition. Jika kita gambarkan flowchart-nya seperti berikut:

flowchart LR data --> condition1{ Outer Condition } condition1 -- true --> condition2{ Inner Condition } condition1 -- false --> End[ return Null ] condition2 -- true --> conditionOk[ return OK ] condition2 -- else --> End[ return Something ]

Berikut adalah contoh implementasi SQLnya:

Jika dijalankan hasilnya seperti berikut:

hr=# select employee_id    as kode_karyawan,
hr-#        commission_pct as besar_komisi,
hr-#        case
hr-#            when commission_pct is not null
hr-#                then
hr-#                case
hr-#                    when commission_pct <= 0.1
hr-#                        then 'Komisi sebesar 10%'
hr-#                    when commission_pct <= 0.2
hr-#                        then 'Komisi sebesar 20%'
hr-#                    when commission_pct <= 0.3
hr-#                        then 'Komisi sebesar 30%'
hr-#                    else 'Komisi lebih besar dari 30%'
hr-#                    end
hr-#            else 'Tidak memiliki komisi'
hr-#            end
hr-# from employees
hr-# limit 60;
 kode_karyawan | besar_komisi |            case             
---------------+--------------+-----------------------------
           100 |              | Tidak memiliki komisi
           101 |              | Tidak memiliki komisi
           102 |              | Tidak memiliki komisi
           103 |              | Tidak memiliki komisi
           104 |              | Tidak memiliki komisi
           105 |              | Tidak memiliki komisi
           106 |              | Tidak memiliki komisi
           145 |         0.40 | Komisi lebih besar dari 30%
           146 |         0.30 | Komisi sebesar 30%
           147 |         0.30 | Komisi sebesar 30%
           148 |         0.30 | Komisi sebesar 30%
           153 |         0.20 | Komisi sebesar 20%
           154 |         0.20 | Komisi sebesar 20%
           155 |         0.15 | Komisi sebesar 20%
           156 |         0.35 | Komisi lebih besar dari 30%
           157 |         0.35 | Komisi lebih besar dari 30%
           158 |         0.35 | Komisi lebih besar dari 30%
(60 rows)

Using CASE-WHEN expression in WHERE clause

Selain pada select statement, CASE-WHEN Expression bisa juga di terapkan pada where clause dengan basic syntax seperti berikut:

select ...
from ...
where 
    CASE WHEN condition THEN where_clause_exp
        [WHEN ...]
        [ELSE where_clause_exp]
    END

Jadi selain value kita juga bisa mengkondisikan suatu kondisi dari where clause contoh implementasi dari SQL seperti berikut:

Jika dijalankan hasilnya seperti berikut:

hr=# select employee_id    as kode_karyawan,
hr-#        commission_pct as besar_komisi,
hr-#        salary         as gaji_sebulan
hr-# from employees
hr-# where case
hr-#           when commission_pct is null and salary <= 2200
hr-#               then true
hr-#           when commission_pct is null
hr-#               then false
hr-#           when commission_pct is not null and salary < 8000
hr-#               then salary in (7500, 7000, 7200)
hr-#           when commission_pct is not null and salary < 12000
hr-#               then salary = 11000
hr-#           end;
 kode_karyawan | besar_komisi | gaji_sebulan 
---------------+--------------+--------------
           128 |              |      2200.00
           132 |              |      2100.00
           136 |              |      2200.00
           148 |         0.30 |     11000.00
           154 |         0.20 |      7500.00
           155 |         0.15 |      7000.00
           160 |         0.30 |      7500.00
           161 |         0.25 |      7000.00
           164 |         0.10 |      7200.00
           174 |         0.30 |     11000.00
           178 |         0.15 |      7000.00
(11 rows)