Уяви собі, що ти хочеш додати два числа, а один з параметрів зберігається як рядок. Або, наприклад, треба фільтрувати дані по року, але дата у тебе зберігається у повному форматі з часом. 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"
Щоб уникнути таких приколів, переконайся, що дані реально можна перетворити у цільовий тип заздалегідь. Наприклад, можна юзати регулярки або додаткові перевірки.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ