Ana içeriğe geç
Modül 6 · Ders 4 ders 4Kurstaki 24/57~10 min
Modül dersleri (4/4)

CAST ve tür dönüşümleri

SQL kesin olarak yazılmıştır: her sütunun bir türü vardır (INTEGER, TEXT, NUMERIC, DATE, TIMESTAMP…) ve birçok işlem bu türleri gerektirir eşleşmek için. Bunu yapmadıklarında veya bir değeri biçimlendirmek istediğinizde farklı olarak — cast kullanırsınız.

İki eşdeğer sözdizimi

SQL
-- SQL standard:
CAST(123 AS TEXT)

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

Her iki form da aynıdır. Kısayol ::type daha kompakttır ve diğer ifadelerle güzel bir şekilde zincirlenir:

SQL
SELECT ordered_at::date AS day,
       (oi.quantity * oi.unit_price)::numeric(10,2) AS total,
       id::text || ' - ' || email AS label
FROM   …;

Veri kümesindeki faydalı yayınlar

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

Bir oyuncu seçimi başarısız olduğunda

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)

string → number veya string → date üzerinden yapılan yayınlar en riskli olanlardır: dize beklenenle tam olarak eşleşmezse hata verirler biçimi. Üretimde, harici verilerde ilk önce doğrulamak en iyisidir TRIM / LOWER / normal ifadeyle.

Yayınla ve SİPARİŞ VER

İnce hatalara yol açan bir durum: metin olarak saklanan sayıların sıralanması.

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

Çözüm: ORDER BY içinde yayınlayın:

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

Deneyin

Egzersiz#sql.m6.l4.e1
Denemeler: 0Yükleniyor…

Her sipariş için kimliği ve günü gösterin (tarih türünün yalnızca sipariş_at'in tarih kısmı). İki sütun. Kimliğe göre sipariş verin.

Düzenleyici yükleniyor…
İpucu göster

TIMESTAMP → DATE kullanımı şu zamanı düşürür:order_at::date.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#sql.m6.l4.e2
Denemeler: 0Yükleniyor…

Her müşteri için kimlik ve e-postayı ' - ' ile ayrılmış olarak birleştiren bir etiket sütunu gösterin (örneğin, '1 - alice.rossi@example.com'). Kimliğe göre sipariş verin.

Düzenleyici yükleniyor…
İpucu göster

|| operatör aynı türden işlenenlere ihtiyaç duyar: kimliği metne dönüştürmek en temiz yoldur.

3 denemeden sonra çözüm mevcut