Pelajaran modul (4/4)
CAST dan ketik konversi
SQL diketik dengan kuat: setiap kolom memiliki tipe (INTEGER, TEXT,
NUMERIC, DATE, TIMESTAMP…), dan banyak operasi memerlukan tipe
untuk mencocokkan. Jika tidak — atau saat Anda ingin memformat suatu nilai
berbeda — Anda menggunakan cast.
Dua sintaksis yang setara
-- SQL standard:
CAST(123 AS TEXT)
-- PostgreSQL shorthand (più comune nella pratica):
123::textKedua bentuk tersebut identik. Singkatan ::type lebih ringkas dan
rantai dengan baik dengan ekspresi lain:
SELECT ordered_at::date AS day,
(oi.quantity * oi.unit_price)::numeric(10,2) AS total,
id::text || ' - ' || email AS label
FROM …;Pemeran yang berguna pada kumpulan data
TIMESTAMP → DATE ordered_at::date
NUMERIC → INTEGER price::int -- tronca!
INTEGER → NUMERIC quantity::numeric -- per evitare div. intera
INTEGER → TEXT id::text -- per concatenare con ||
TEXT → DATE '2024-03-05'::date
NUMERIC → TEXT price::text -- per LIKE su numeriSaat pemeran bisa gagal
SELECT 'abc'::int; -- ERRORE: invalid input syntax for type integer
SELECT '12.5'::int; -- ERRORE: invalid input syntax for type integer
SELECT 12.5::int; -- 12 (cast numerico-numerico: arrotonda)Pemeran dari string → number atau string → date adalah yang paling berisiko:
mereka memunculkan kesalahan jika string tidak sesuai dengan yang diharapkan
memformat. Dalam produksi, pada data eksternal, yang terbaik adalah memvalidasi terlebih dahulu
dengan TRIM / LOWER / regex.
Pemeran dan ORDER BY
Kasus yang menghasilkan bug halus: mengurutkan nomor disimpan sebagai teks.
SELECT '2', '10', '1' ORDER BY 1; -- '1', '10', '2' (alfabetico!)Solusi: masukkan ke dalam ORDER BY:
SELECT code FROM articles ORDER BY code::int;Cobalah
Untuk setiap pesanan, tampilkan id dan hari (hanya bagian tanggal dari pesanan_at, dari jenis tanggal). Dua kolom. Pesan berdasarkan ID.
Tunjukkan petunjuk
Pemeran TIMESTAMP → DATE menghilangkan waktu: order_at::date.
Solusi tersedia setelah 3 upaya
Tinjau latihan
Untuk setiap pelanggan, tampilkan kolom label yang menggabungkan id dan email yang dipisahkan dengan ' - ' (misalnya '1 - alice.rossi@example.com'). Pesan berdasarkan ID.
Tunjukkan petunjuk
|| operator memerlukan operan dengan tipe yang sama: memasukkan id ke teks adalah cara paling bersih.
Solusi tersedia setelah 3 upaya