Lompati ke konten utama
Modul 6 · Pelajaran 4 dari 424/57 dalam kursus~10 min
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
-- SQL standard:
CAST(123 AS TEXT)

-- PostgreSQL shorthand (più comune nella pratica):
123::text

Kedua bentuk tersebut identik. Singkatan ::type lebih ringkas dan rantai dengan baik dengan ekspresi lain:

SQL
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

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

Saat pemeran bisa gagal

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

SQL
SELECT '2', '10', '1' ORDER BY 1;  -- '1', '10', '2'   (alfabetico!)

Solusi: masukkan ke dalam ORDER BY:

SQL
SELECT code FROM articles ORDER BY code::int;

Cobalah

Latihan#sql.m6.l4.e1
Upaya: 0Memuat…

Untuk setiap pesanan, tampilkan id dan hari (hanya bagian tanggal dari pesanan_at, dari jenis tanggal). Dua kolom. Pesan berdasarkan ID.

Memuat editor…
Tunjukkan petunjuk

Pemeran TIMESTAMP → DATE menghilangkan waktu: order_at::date.

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#sql.m6.l4.e2
Upaya: 0Memuat…

Untuk setiap pelanggan, tampilkan kolom label yang menggabungkan id dan email yang dipisahkan dengan ' - ' (misalnya '1 - alice.rossi@example.com'). Pesan berdasarkan ID.

Memuat editor…
Tunjukkan petunjuk

|| operator memerlukan operan dengan tipe yang sama: memasukkan id ke teks adalah cara paling bersih.

Solusi tersedia setelah 3 upaya