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 standard:
CAST(123 AS TEXT)
-- PostgreSQL shorthand (più comune nella pratica):
123::textHer iki form da aynıdır. Kısayol ::type daha kompakttır ve
diğer ifadelerle güzel bir şekilde zincirlenir:
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
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 numeriBir oyuncu seçimi başarısız olduğunda
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ı.
SELECT '2', '10', '1' ORDER BY 1; -- '1', '10', '2' (alfabetico!)Çözüm: ORDER BY içinde yayınlayın:
SELECT code FROM articles ORDER BY code::int;Deneyin
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.
İ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
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.
İ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