JavaRush /Курсы /SQL SELF /Преобразование типов данных с CAST() и :: — примеры и осо...

Преобразование типов данных с CAST() и :: — примеры и особенности

SQL SELF
5 уровень , 3 лекция
Открыта

Представьте себе, что вы хотите сложить два числа, а один из параметров хранится в виде строки. Или, например, вы хотите фильтровать данные по году, но дата у вас хранится в полном формате с временем. PostgreSQL может быть не слишком рад от вашей задумки, и вам придётся вмешаться, чтобы привести данные к нужному типу.

Преобразование типов помогает:

  • Упростить обработку данных, чтобы использовать их в вычислениях.
  • Создать более читабельные и структурированные данные для экспорта или анализа.
  • Устранять ошибки, связанные с несоответствием типов данных.

Основы преобразования типов данных: CAST() и ::

1. CAST() — старший брат любого преобразования

Функция CAST() — это "официальный" способ преобразования значений из одного типа данных в другой. Она работает как универсальный переводчик.

Синтаксис:

CAST(значение AS целевой_тип_данных)

Пример 1: Преобразование строки в число.

SELECT CAST('123' AS INTEGER); -- Результат: 123

Пример 2: Преобразование числа в строку.

SELECT CAST(123 AS TEXT); -- Результат: '123'

Пример 3: Преобразование даты в строку.

SELECT CAST(NOW() AS TEXT); -- Результат: '2023-10-25 15:00:00.000000'

2. Оператор :: — лаконичная альтернатива

Если CAST() кажется вам слегка многословным, PostgreSQL предлагает синтаксис ::. Это сокращённый способ преобразования, популярный благодаря своей краткости.

Синтаксис:

значение::целевой_тип_данных

Пример 1: Преобразование строки в число.

SELECT '123'::INTEGER; -- Результат: 123

Пример 2: Преобразование числа в строку.

SELECT 123::TEXT; -- Результат: '123'

Пример 3: Преобразование даты в строку.

SELECT NOW()::TEXT; -- Результат: '2023-10-25 15:00:00.000000'

Реальные примеры использования преобразования типов

1. Преобразование чисел и строк

Допустим, у вас есть таблица students, где столбец student_id хранится как строка, но вы хотите сравнить его с числовым значением. Без преобразования ничего не выйдет.

student_id first_name last_name birth_date grade
101 Alex Lin 2008-03-15 9
102 Maria Chi 2009-07-22 8
103 Axel Ivy 2007-11-30 10
104 Nat Sok 2008-01-18 9
105 Pol Frez 2009-05-05 8

Поэтому в запросе нужно явно преобразовать колонку student_id к числу:

SELECT *
FROM students
WHERE student_id::INTEGER = 101;

Аналогичный запрос с использованием CAST():

SELECT *
FROM students
WHERE CAST(student_id AS INTEGER) = 101;

Преобразование дат

Когда нужно извлечь часть даты или преобразовать её в строку, преобразование типов тоже приходит на помощь. Например, у вас есть таблица courses с датами начала курсов в столбце start_date.

course_id course_name start_date
1 Введение в Python 2025-01-15
2 Основы SQL 2025-03-01
3 Анализ данных 2025-05-10
4 Веб-разработка 2025-06-20
5 Машинное обучение 2025-09-05

Пример: Извлечь год в виде числа.

SELECT start_date::DATE, start_date::TEXT, start_date::TIMESTAMP
FROM courses;

Тогда результат будет таким:

start_date (DATE) start_date (TEXT) start_date (TIMESTAMP)
2025-01-15 2025-01-15 2025-01-15 00:00:00
2025-03-01 2025-03-01 2025-03-01 00:00:00
2025-05-10 2025-05-10 2025-05-10 00:00:00
2025-06-20 2025-06-20 2025-06-20 00:00:00
2025-09-05 2025-09-05 2025-09-05 00:00:00

Пример: Преобразовать дату в "чистую строку".

SELECT TO_CHAR(start_date, 'DD-MM-YYYY')

Тогда результат будет таким:

to_char
15-01-2025
01-03-2025
10-05-2025
20-06-2025
05-09-2025

Ошибка: Когда преобразование ломается?

Трюк с преобразованием данных не всегда работает. Иногда PostgreSQL явно даёт понять, что он "не понимает" ваши намерения. Вот классический пример: вы пытаетесь преобразовать текст, который выглядит как число, но в тексте есть лишние символы.

Пример ошибки:

SELECT '123abc'::INTEGER;
-- ОШИБКА:  invalid input syntax for type integer: "123abc"

Чтобы избежать таких проблем, убедитесь, что данные действительно могут быть преобразованы в целевой тип заранее. Например, вы можете использовать регулярные выражения или дополнительные проверки.

2
Задача
SQL SELF, 5 уровень, 3 лекция
Недоступна
Преобразование строки в число
Преобразование строки в число
2
Задача
SQL SELF, 5 уровень, 3 лекция
Недоступна
Преобразование дат и вычисления
Преобразование дат и вычисления
Комментарии (11)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Julia Уровень 6
12 ноября 2025
Как в webstorm сделать так, чтобы было видно результат запроса? У меня есть только список заданий, описание текущей задачи и консоль для написания запроса.
Lev Nagornov Уровень 6
21 ноября 2025
Перечитай лекцию про подключение плагина, а именно шаг 5: https://javarush.com/quests/lectures/ru.javarush.sql.core.lecture.level31.lecture10
Anemon Уровень 13 Expert
4 августа 2025
🤓
V Уровень 14
5 июля 2025
Хотелось бы узнать почему не засчитывается код, который дает правильный результат. Давайте-ка без таких вот подходов - "только так, как я себе подумал". SELECT order_id, order_date::DATE AS order_date, amount FROM orders WHERE amount > 300 AND DATE_PART('month', order_date) = '09' AND DATE_PART('year', order_date) = '2023';
Дмитрий Уровень 7
8 июля 2025
наверное потому что DATE_PART('month', order_date) вернет 9, а не '09', также как и DATE_PART('year', order_date) вернет 2023, а не '2023'
V Уровень 14
8 июля 2025
"наверное" - это не ответ, а догадка, а мне хотелось бы таки услышать ответ. Потому как РЕЗУЛЬТАТ ЗАПРОСА в моем варианте идентичен правильному (должны и выводяться требуемые задачей ДВЕ записи)
Андрей Глушков Уровень 13
18 июля 2025
Добрый день. DATE_PART('month', order_date) = '09' AND DATE_PART('year', order_date) = '2023'; Вы берете 09 и 2023 в кавычки - это строка, а не дата.
Anton Nikonorov Уровень 9
20 августа 2025
Соглашусь с автором, что тут что-то нечисто. И есть мнение, что это "что-то" на уровне СУБД: как будто СУБД понимает, к какому типу нужно приводить значение. Похожий пример, в котором результат запроса будет true, хотя не должен из-за несовпадения типов данных:

SELECT DATE_PART( 'month', CURRENT_DATE )::INTEGER = '08';
Такие запросы, конечно, не комильфо: результат на реальных базах может быть неожиданным, поэтому приводить данные к ожидаемым типам нужно. Ну а документация - "наше всё".
Anton Nikonorov Уровень 9
20 августа 2025
И в продолжение разговора - обе закоменченные строки выдали нужный результат:

SELECT order_id, order_date::DATE, amount
FROM orders
WHERE amount > 300 AND DATE_PART( 'year', order_date ) = 2023 AND DATE_PART( 'month', order_date ) = 9;
-- WHERE amount > 300 AND DATE_PART( 'year', order_date ) = '2023' AND DATE_PART( 'month', order_date ) = '09';
-- WHERE amount > 300 AND ( order_date >= DATE( '2023-09-01' ) AND order_date < DATE( '2023-10-01' ) );
playboiesko Уровень 5 Expert
30 июня 2025
Не открываются задачи с прохождением лекций в webstorm, как исправить?
Anastasia Yakush Уровень 8
3 июля 2025
Попробуйте в плагине в Меню пользователя, где ваша аватарка, выбрать пункт Синхронизировать задачи.