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"

Щоб уникнути таких приколів, переконайся, що дані реально можна перетворити у цільовий тип заздалегідь. Наприклад, можна юзати регулярки або додаткові перевірки.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ