Строки и приведение типов
Работа с текстом
Данные редко бывают идеально чистыми: имена в разном регистре, лишние пробелы, коды, склеенные с названиями. Основные функции PostgreSQL для текста:
| Функция | Что делает | Пример |
|---|---|---|
|| | склеивает строки | city || ' (' || airport_code || ')' |
UPPER, LOWER, INITCAP | меняют регистр | INITCAP('ivan petrov') → Ivan Petrov |
LENGTH | длина строки | LENGTH(airport_name) |
LEFT, SUBSTRING | часть строки | LEFT(passenger_name, 1) |
SPLIT_PART | кусок строки по разделителю | SPLIT_PART('IVAN PETROV', ' ', 2) → PETROV |
TRIM, REPLACE | убирают пробелы, заменяют подстроку | REPLACE(model, 'Airbus ', '') |
Приведение типов
Иногда значение нужно превратить в другой тип: число в текст, текст в дату, целое в дробное. В PostgreSQL для этого есть две записи: стандартная CAST(range AS numeric) и короткая range::numeric.
Самая частая причина — целочисленное деление. range / speed на целых числах отбросит дробную часть: 11100 / 905 даст 12, а не 12,27. Достаточно привести одно из чисел к дробному типу: range::numeric / speed.
Типичные ошибки
- Склейка с NULL.
'Рейс ' || NULLдаётNULL— вся строка пропадает. ФункцияCONCAT('Рейс ', NULL)пустое значение просто пропустит. - Сравнение без учёта регистра. Если в данных встречаются разные регистры, сравнивайте приведённые значения:
LOWER(city) = 'moscow'. - Числа, сохранённые как текст. Текст сортируется посимвольно:
'10'окажется раньше'9'. Перед сортировкой и сравнением приводите к числу.
Практика
6- Тест 1 — Что вернёт выражение «11100 / 905» в PostgreSQL, если оба числа целые?
- Тест 2 — Что вернёт «'Рейс ' || NULL»?
- Задача 1 — Город и код аэропорта
- Задача 2 — Самые длинные названия аэропортов
- Задача 3 — Самые частые фамилии пассажиров
- Задача 4 — Сколько часов в воздухе
Задачи решаются прямо здесь, в браузере, на учебной базе — нужна только бесплатная регистрация, чтобы сохранялись ответы и прогресс.
Потренируйтесь в тренажёре
7Задачи на ту же тему, но на другой базе — продажи магазина электроники. Хороший способ проверить, что тема понятна, а не просто запомнилась на примерах урока.
- лёгкаяКрупные завершённые продажи
- лёгкаяПродавцы канала Online
- лёгкаяЧисло завершённых продаж
- лёгкаяПолное имя покупателя
- лёгкаяИнициал и фамилия