Модульні уроки (4/4)
Перетворення CAST і типу
SQL строго типізований: кожен стовпець має тип (INTEGER, TEXT,
NUMERIC, DATE, TIMESTAMP…), і для багатьох операцій потрібні типи
відповідати. Коли вони цього не роблять або коли ви хочете відформатувати значення
інакше — ви використовуєте cast.
Два еквівалентних синтаксису
-- SQL standard:
CAST(123 AS TEXT)
-- PostgreSQL shorthand (più comune nella pratica):
123::textЦі дві форми ідентичні. Скорочення ::type є більш компактним і
ланцюжки добре з іншими виразами:
SELECT ordered_at::date AS day,
(oi.quantity * oi.unit_price)::numeric(10,2) AS total,
id::text || ' - ' || email AS label
FROM …;Корисні приведення до набору даних
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Коли гіпс може вийти з ладу
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
Випадок, який породжує тонкі помилки: сортування чисел, збережених у вигляді тексту.
SELECT '2', '10', '1' ORDER BY 1; -- '1', '10', '2' (alfabetico!)Рішення: закинути всередину ORDER BY:
SELECT code FROM articles ORDER BY code::int;Спробуйте
Для кожного замовлення показуйте ідентифікатор і день (лише частина дати ordered_at типу date). Дві колонки. Замовлення по id.
Показати підказку
Приведення TIMESTAMP → DATE видаляє час: ordered_at::date.
Рішення доступне після 3 спроб
Повторна вправа
Для кожного клієнта відобразіть стовпець мітки, який об’єднує ідентифікатор та електронну адресу, розділених знаком «-» (наприклад, «1 – alice.rossi@example.com»). Замовлення по id.
Показати підказку
|| Оператор вимагає операндів того самого типу: переведення ідентифікатора в текст є найчистішим способом.
Рішення доступне після 3 спроб