Lekcje modułu (4/4)
CAST i konwersje typów
SQL ma silną typację: każda kolumna ma typ (INTEGER, TEXT,
NUMERIC, DATE, TIMESTAMP…), a wiele operacji wymaga typów
pasować. Kiedy nie — lub gdy chcesz sformatować wartość
inaczej — używasz obsady.
Dwie równoważne składnie
-- SQL standard:
CAST(123 AS TEXT)
-- PostgreSQL shorthand (più comune nella pratica):
123::textObie formy są identyczne. Skrót ::type jest bardziej zwarty i
ładnie łączy się z innymi wyrażeniami:
SELECT ordered_at::date AS day,
(oi.quantity * oi.unit_price)::numeric(10,2) AS total,
id::text || ' - ' || email AS label
FROM …;Przydatne rzuty na zbiór danych
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 numeriKiedy rzut może się nie udać
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)Rzuty z ciąg → liczba lub ciąg → data są najbardziej ryzykowne:
zgłaszają błąd, jeśli ciąg znaków nie odpowiada dokładnie oczekiwanemu
formatować. Na produkcji, na danych zewnętrznych, najlepiej najpierw przeprowadzić walidację
z TRIM / LOWER / regex.
Przesyłaj i ZAMÓW PRZEZ
Przypadek, który generuje subtelne błędy: sortowanie liczb przechowywanych jako tekst.
SELECT '2', '10', '1' ORDER BY 1; -- '1', '10', '2' (alfabetico!)Rozwiązanie: wrzuć do środka ORDER BY:
SELECT code FROM articles ORDER BY code::int;Spróbuj
Dla każdego zamówienia podaj identyfikator i dzień (tylko część daty z zamówionego_at typu date). Dwie kolumny. Zamów według identyfikatora.
Pokaż wskazówkę
Rzut TIMESTAMP → DATE obniża czas: zamówiony_at::data.
Rozwiązanie dostępne po 3 próbach
Przejrzyj ćwiczenie
Dla każdego klienta pokaż kolumnę z etykietą, która łączy identyfikator i adres e-mail oddzielone znakami „-” (np. „1 - alice.rossi@example.com”). Zamów według identyfikatora.
Pokaż wskazówkę
|| operator wymaga operandów tego samego typu: najczystszym sposobem jest rzutowanie identyfikatora na tekst.
Rozwiązanie dostępne po 3 próbach