Przejdź do głównej treści
eLearner.app
Moduł 6 · Lekcja 4 z 424/57 w kursie~10 min
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
-- SQL standard:
CAST(123 AS TEXT)

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

Obie formy są identyczne. Skrót ::type jest bardziej zwarty i ładnie łączy się z innymi wyrażeniami:

SQL
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

SQL
TIMESTAMPDATE          ordered_at::date
NUMERICINTEGER       price::int           -- tronca!
INTEGERNUMERIC       quantity::numeric    -- per evitare div. intera
INTEGERTEXT          id::text             -- per concatenare con ||
TEXTDATE          '2024-03-05'::date
NUMERICTEXT          price::text          -- per LIKE su numeri

Kiedy rzut może się nie udać

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)

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.

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

Rozwiązanie: wrzuć do środka ORDER BY:

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

Spróbuj

Ćwiczenie#sql.m6.l4.e1
Próby: 0Ładowanie...

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.

Ładowanie edytora...
Pokaż wskazówkę

Rzut TIMESTAMP → DATE obniża czas: zamówiony_at::data.

Rozwiązanie dostępne po 3 próbach

Przejrzyj ćwiczenie

Ćwiczenie#sql.m6.l4.e2
Próby: 0Ładowanie...

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.

Ładowanie edytora...
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