Представьте себе, что вы хотите сложить два числа, а один из параметров хранится в виде строки. Или, например, вы хотите фильтровать данные по году, но дата у вас хранится в полном формате с временем. 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"
Чтобы избежать таких проблем, убедитесь, что данные действительно могут быть преобразованы в целевой тип заранее. Например, вы можете использовать регулярные выражения или дополнительные проверки.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ