WHAT'S NEW?
Loading...

Belajar PostgreSQL: Membandingkan Data Dengan Menggunakan Operator - Part 2

Belajar PostgreSQL: Membandingkan Data Dengan Menggunakan Operator - Part 2

Server programming bukan hanya berarti membuat fungsi didalam server database, sebenarnya ada banyak hal yang bisa dilakukan. Utk kasus yg kompleks, kita dapat membuat sebuah TYPE maupun OPERATOR sesuai yg kita butuhkan utk membandingkan sebuah jenis, misalnya kita ingin membandingkan antara buah nangka dan durian. Pertama kita definisikan TYPE yg akan dibuat, lalu berikan perintah utk membandingkan buah yang kita inginkan, katakanlah 1 buah nangka sebanding dengan 1.5 buah durian.

Kita buat TYPE terlebih dahulu, misalnya seperti dibawah ini:
CREATE TYPE KUANTITAS as (nama_buah text, kuantitas int);
Kemudian contoh penggunaannya yg sederhana sebagai berikut:
SELECT '("DURIAN", 3)'::KUANTITAS;
kuantitas_buah
------------
(DURIAN,3)
(1 row)
Kita lanjutkan dengan membuat sebuah fungsi utk proses perbandingan kuantitas antara 2 buah tersebut diatas:
CREATE OR REPLACE FUNCTION banding_kuantitas(
   jenis_buah_a KUANTITAS,
   jenis_buah_b KUANTITAS
) RETURNS BOOL AS
$$
BEGIN
   IF (jenis_buah_a.nama_buah = 'DURIAN' AND jenis_buah_b.nama_buah = 'NANGKA')
   THEN
     RETURN jenis_buah_a.kuantitas > (1.5 * jenis_buah_b.kuantitas);
   END IF;

   IF (jenis_buah_a.nama_buah = 'NANGKA' AND jenis_buah_b.nama_buah = 'DURIAN')
   THEN
     RETURN (1.5 * jenis_buah_a.kuantitas) > jenis_buah_b.kuantitas;
   END IF;

   RETURN jenis_buah_a.kuantitas > jenis_buah_b.kuantitas;
END;
$$
LANGUAGE plpgsql;
Masih dengan contoh yg sederhana, dimana ada kondisi didalamnya yg harusnya bisa dengan mudah dipahami maksud dari isi kondisi tersebut. Mari kita coba tes fungsinya, perlu diketahui hasil dari fungsi bukanlah sebuah STRING melainkan BOOLEAN sehingga output yg didapatkan adalah berupa hasil BOOLEAN, f utk false dan t utk true.
SELECT banding_kuantitas('("DURIAN", 3)'::KUANTITAS, '("NANGKA", 2)'::KUANTITAS);
banding_kuantitas
--------------
f
(1 row)
Kenapa kita dapat output false, lihat kondisi bagian pertama, karena memang kuantitas durian tidak lebih besar dari kondisi yg diharapkan. Kita coba lagi utk kondisi berikutnya.
SELECT banding_kuantitas('("DURIAN", 4)'::KUANTITAS, '("NANGKA", 2)'::KUANTITAS);
banding_kuantitas
--------------
t
(1 row)
Nah disini kita mendapatkan hasil true, karena memang kali ini kuantitas durian mencukupi sehingga perbandingan yg kita lakukan memenuhi kondisi yg sudah kita tentukan didalam fungsi.

Disini kita baru selesai pada bagian TYPE saja, mari kita lanjutkan dengan OPERATOR. Kita bisa membuat query diatas menjadi lebih bermakna ( katakanlah begitu :D ). Mari langsung kita buat sebuah OPERATOR utk menangani proses seperti query diatas.
CREATE OPERATOR > (
   leftarg = KUANTITAS,
   rightarg = KUANTITAS,
   procedure = banding_kuantitas,
   commutator = >
);
Mungkin dari contoh OPERATOR yg dibuat itu mungkin sedikit membingungkan, tapi sebenarnya itu sederhana. Kita hanya menentukan argument terkait ( utk detail bisa langsung ke official web PostgreSQL ya :D )

Mari kita coba langsung dengan masih menggunakan query perbadingan sebelumnya.
SELECT '("NANGKA", 2)'::KUANTITAS > '("DURIAN", 2)'::KUANTITAS;
?column?
----------
t
(1 row)

SELECT '("NANGKA", 2)'::KUANTITAS > '("DURIAN", 3)'::KUANTITAS;
?column?
----------
f
(1 row)
Hasil perbandingan yg didapatkan adalah sama. Cukup mudah dimengerti ( saya harap begitu :D ), dengan membuat hal semacam ini tentunya akan dapat membantu kita mendapatkan data ke dalam aplikasi menjadi lebih to the point tanpa harus membuat query utk kondisi yg diharapkan.

Jangan lupa silahkan isi kolom komentar jika ada yg ingin ditanyakan ataupun koreksi yg saya harus lakukan.

0 comments:

Post a Comment