Уроки модуля (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 / регулярным выражением.
В ролях и ЗАКАЗАТЬ ПО
Случай, приводящий к тонким ошибкам: сортировка чисел, хранящихся в виде текста.
SELECT '2', '10', '1' ORDER BY 1; -- '1', '10', '2' (alfabetico!)Решение: залить внутрь ORDER BY:
SELECT code FROM articles ORDER BY code::int;Попробуйте это
Для каждого заказа покажите идентификатор и день (только часть даты в order_at типа date). Две колонки. Заказ по идентификатору.
Показать подсказку
Приведение TIMESTAMP → DATE удаляет время: order_at::date.
Решение доступно после 3 попыток
Обзор упражнения
Для каждого клиента покажите столбец метки, который объединяет идентификатор и адрес электронной почты, разделенные знаком «-» (например, «1 — alice.rossi@example.com»). Заказ по идентификатору.
Показать подсказку
|| Оператору требуются операнды одного типа: приведение идентификатора к тексту — самый чистый способ.
Решение доступно после 3 попыток