Виды конкатенации
Конкатенацией называется операция, которая позволяет соединить несколько текстовых строк в одну.
В работе с базами данных конкатенация используется, когда нужно соединить значения нескольких полей или присоединить к значениям полей текст.
В SQL используется три вида конкатенации:
- Простая конкатенация;
- Конкатенация с разделителем;
- Групповая конктенация.
В различных "диалектах" языка SQL функции, реализующие конкатенацию, несколько различаются своим синтаксисом. Но принципы их работы одинаковы. Эти принципы будут рассмотрены на примере функций СУБД MySQL.
Простая конкатенация
Простая конкатенация в СУБД MySQL выполняется с помощью встроенной функции CONCAT() имеющей следующий синтаксис:
CONCAT(строка1, строка2, ……строкаN)
Строки, являющиеся аргументами функции, могут быть именами полей, а могут быть текстовыми строками в кавычках.
В качестве примера рассмотрим запрос:
SELECT concat("Абитуриент ", fio, " возрастом ", age, " рекомендован(a) к зачислению") as text1 FROM abiturient;
Результатом запроса будет собранный из кусочков текст:
Конкатенация с разделителем
Этот вид конкатенации в MySQL выполняется с помощью функции CONCAT_WS(), имеющей следующий синтаксис:
CONCAT_WS(‘символ_разделитель’, строка1, строка2…)
В этом случае между соединяемыми строками будет установлен символ-разделитель.
Например, в данном запросе в качестве разделителя используется запятая:
SELECT concat_ws(',', fio,age,gender) as text1 FROM abiturient;
Результат:
Если в качестве разделителя использовать пустую строку, то результат будет полностью совпадать с результатом простой конкатенации. Если разделителем должен быть символ кавычки ', то его нужно экранировать обратным слешем – '\''.
SELECT concat_ws('\'', fio,age,gender) as text1 FROM abiturient;
Групповая конкатенация
Пусть даны две таблицы. В одной хранятся личные данные абитурентов, а в другой – поданные заявления. Считается, что каждый абитуриент может подать несколько заявлений на разные специальности. Тогда, чтобы увидеть список абитуриентов и список специальностей, на которые они подали заявления, нужно построить следующий запрос:
SELECT abiturient.idabiturient, abiturient.fio, application.namespec FROM abiturient JOIN application ON abiturient.idabiturient=application.idabiturient;
Результат запроса будет таким:
Теперь усложним задачу. Пусть необходимо собрать специальности по каждому абитуриенту в группу и записать их через запятую. То есть в результате должна получиться такая таблица:
Записанные через запятую названия специальностей, относящиеся к данному абитуриенту, - это и есть результат групповой конкатенации.
Для выполнения групповой конкатенации в MySQL используется инструкция GROUP BY и функция GROUP_CONCAT ().
GROUP_CONCAT([DISTINCT] строка1, строка2,.. [ORDER BY имя_поля или выражение [ASC | DESC]] [SEPARATOR 'символ_разделитель'])
Необязательная инструкция DISTINCT позволяет удалить из списка совпадающие строки. Инструкция ORDER BY позволяет упорядочить строки по какому-либо полю или выражению. Упорядочивание по возрастанию определяется инструкцией ASC, по убыванию –DESC. Инструкция SEPARATOR позволяет задать символ, который будет разделять строки. По умолчанию разделителем является запятая.
Все запросы с групповой конкатенацией являются запросами группового типа. Функция GROUP_CONCAT() может быть отнесена к групповым операциям наряду с COUNT(), SUM(),MIN(),MAX(), AVG().
Таким образом, для получения списка специальностей по каждому абитуриенту нужно выполнить следующий запрос:
SELECT abiturient.idabiturient, abiturient.fio, group_concat(application.namespec ORDER BY namespec separator ', ') as spec FROM abiturient JOIN application ON abiturient.idabiturient=application.idabiturient GROUP BY abiturient.idabiturient;