Перейти к основному содержимому
Модуль 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 / регулярным выражением.

В ролях и ЗАКАЗАТЬ ПО

Случай, приводящий к тонким ошибкам: сортировка чисел, хранящихся в виде текста.

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Загрузка…

Для каждого заказа покажите идентификатор и день (только часть даты в order_at типа date). Две колонки. Заказ по идентификатору.

Загрузка редактора…
Показать подсказку

Приведение TIMESTAMP → DATE удаляет время: order_at::date.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#sql.m6.l4.e2
Попыток: 0Загрузка…

Для каждого клиента покажите столбец метки, который объединяет идентификатор и адрес электронной почты, разделенные знаком «-» (например, «1 — alice.rossi@example.com»). Заказ по идентификатору.

Загрузка редактора…
Показать подсказку

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

Решение доступно после 3 попыток