Работа с текстовыми данными — это ежедневная часть задач баз данных. Представьте, что вы разработчик интернет-магазина, и у вас есть база данных пользователей. Вам нужно вывести полные имена пользователей для приветственного баннера на сайте, например: "Добро пожаловать, Otto Art!". Или вам требуется стандартизировать все email-адреса (например, перевести их в нижний регистр). В этих случаях без строковых операций никак.
PostgreSQL предоставляет мощные инструменты для работы с текстом. Сегодня мы разберём три основных инструмента:
CONCAT()— объединение строк.UPPER()— преобразование строки в верхний регистр.LOWER()— преобразование строки в нижний регистр.
Работа с функцией CONCAT()
Функция CONCAT() позволяет соединять несколько строк в одну. Она незаменима, если данные хранятся в разных столбцах, но вам нужно объединить их для вывода.
Синтаксис
CONCAT(string1, string2, ..., stringN)
string1,string2,stringN— строки или столбцы, которые вы хотите объединить.- Возвращает одну строку, состоящую из всех аргументов.
Пример: обрабатываем имена
Допустим, у нас есть таблица students:
| first_name | last_name |
|---|---|
| Otto | Art |
| Maria | Chi |
| Anna | Pal |
Наша задача: вывести полные имена студентов в формате "Имя Фамилия".
Запрос:
SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM students;
Результат:
| full_name |
|---|
| Otto Art |
| Mariq Chi |
| Anna Pal |
Обратите внимание на ' ' между именем и фамилией. Это пробел, который мы добавили для разделения строк.
Особенности работы
CONCAT() игнорирует NULL. Если один из аргументов равен NULL, он просто пропустится. Если вы еще не знаете что такое NULL, не волнуйтесь - мы расскажем о нем немного позднее.
Альтернатива CONCAT() — оператор ||, например:
SELECT first_name || ' ' || last_name AS full_name FROM students;
Изменение регистра строк: UPPER() и LOWER()
Представьте, что вы работаете с email-адресами, которые пользователи ввели в самых разных регистрах: ivan@example.com, IVAN@EXAMPLE.COM. Для стандартизации часто требуется:
- привести текст к одному виду перед сравнением (например,
lowercase). - выделить важные слова (например,
UPPERCASEдля заголовков).
UPPER(): текст в верхний регистр
Функция UPPER() преобразует текст в строку заглавных букв.
Синтаксис:
UPPER(string)
string— строка или название текстового столбца.
Пример:
В таблице students добавился столбец email:
| first_name | last_name | |
|---|---|---|
| Otto | Art | otto@example.com |
| Maria | Chi | MARIA@EXAMPLE.com |
| Анна | Pal | anna.pal@mail.ru |
Хотим вывести email-адреса в верхнем регистре:
SELECT email, UPPER(email) AS email_upper
FROM students;
Результат:
| email_upper | |
|---|---|
| otto@example.com | OTTO@EXAMPLE.COM |
| MARIA@EXAMPLE.com | MARIA@EXAMPLE.COM |
| anna.pal@gmail.com | ANNA.PAL@GMAIL.COM |
LOWER(): текст в нижний регистр
Аналогично, функция LOWER() преобразует текст в нижний регистр.
Синтаксис:
LOWER(string)
Пример:
Приведём email-адреса в нижний регистр:
SELECT email, LOWER(email) AS email_lower
FROM students;
Результат:
| email_lower | |
|---|---|
| otto@example.com | otto@example.com |
| MARIA@EXAMPLE.com | maria@example.com |
| anna.pal@gmail.com | anna.pal@gmail.com |
Практические примеры и кейсы
Давайте объединим всё вышеизученное.
Создание полного имени в верхнем регистре
Запрос:
SELECT CONCAT(UPPER(first_name), ' ', UPPER(last_name)) AS full_name_upper
FROM students;
Результат:
| full_name_upper |
|---|
| OTTO ART |
| MARIA CHI |
| ANNA PAL |
Здесь мы использовали функцию CONCAT(), чтобы объединить имя и фамилию, и UPPER() для приведения текста к верхнему регистру.
Пример: стандартизация email-адресов
Хотим привести все email-адреса к одному виду — нижнему регистру:
UPDATE students
SET email = LOWER(email);
Теперь все email-адреса в таблице выглядят одинаково, вне зависимости от исходного регистра.
Как работает оператор UPDATE вы узнаете в следующих лекциях.
Подготовка приветствия для пользователей
Добавим к полным именам приветствие "Добро пожаловать":
SELECT CONCAT('Добро пожаловать, ', first_name, ' ', last_name, '!') AS greeting
FROM students;
Результат:
| greeting |
|---|
| Добро пожаловать, Otto Art! |
| Добро пожаловать, Maria Chi! |
| Добро пожаловать, Anna Pal! |
Типичные ошибки при работе с текстовыми функциями
Если пропустить пробел в CONCAT(), результат может выглядеть некорректно. Например:
SELECT CONCAT(first_name, last_name) AS full_name
FROM students;
Результат будет: "OttoArt", "MariaChi". Всегда добавляйте пробел в нужных местах.
Использование NULL. Если один из аргументов CONCAT() равен NULL, строка может оказаться неполной. Например:
SELECT CONCAT(first_name, ' ', middle_name, ' ', last_name) AS full_name
FROM students;
Если middle_name = NULL, то результат будет "Otto NULL Art". Чтобы избежать этого, можно использовать функцию COALESCE():
SELECT CONCAT(first_name, ' ', COALESCE(middle_name, ''), ' ', last_name) AS full_name
FROM students;
Подробнее о NULL и функции COALESCE() вы узнаете в ближайших лекциях :P
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ