Перейти до основного вмісту
Модуль 6 · Урок 4 із 424/57 у курсі~10 min
Модульні уроки (4/4)

Перетворення CAST і типу

SQL строго типізований: кожен стовпець має тип (INTEGER, TEXT, NUMERIC, DATE, TIMESTAMP…), і для багатьох операцій потрібні типи відповідати. Коли вони цього не роблять або коли ви хочете відформатувати значення інакше — ви використовуєте cast.

Два еквівалентних синтаксису

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

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

Ці дві форми ідентичні. Скорочення ::type є більш компактним і ланцюжки добре з іншими виразами:

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

Корисні приведення до набору даних

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

Коли гіпс може вийти з ладу

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)

Приведення з рядок → число або рядок → дата є найбільш ризикованими: вони викликають помилку, якщо рядок не зовсім відповідає очікуваному формат. У виробництві зовнішні дані найкраще спочатку перевірити з TRIM / LOWER / регулярним виразом.

Актори та ORDER BY

Випадок, який породжує тонкі помилки: сортування чисел, збережених у вигляді тексту.

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

Рішення: закинути всередину ORDER BY:

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

Спробуйте

вправи#sql.m6.l4.e1
Спроби: 0Завантаження…

Для кожного замовлення показуйте ідентифікатор і день (лише частина дати ordered_at типу date). Дві колонки. Замовлення по id.

Завантаження редактора…
Показати підказку

Приведення TIMESTAMP → DATE видаляє час: ordered_at::date.

Рішення доступне після 3 спроб

Повторна вправа

вправи#sql.m6.l4.e2
Спроби: 0Завантаження…

Для кожного клієнта відобразіть стовпець мітки, який об’єднує ідентифікатор та електронну адресу, розділених знаком «-» (наприклад, «1 – alice.rossi@example.com»). Замовлення по id.

Завантаження редактора…
Показати підказку

|| Оператор вимагає операндів того самого типу: переведення ідентифікатора в текст є найчистішим способом.

Рішення доступне після 3 спроб