Конкатенация в SQL-запросах. Sql concat описание
Функция CONCAT_WS - сложение строк с разделителем
Функция CONCAT_WS предназначена для сложения строк при выборке из базы данных с использованием разделителя. Строками обычно выступают поля таблиц.
См. также функцию CONCAT, которая складывает строки без использования разделителя.
См. также функцию GROUP_CONCAT, которая складывает содержимое одного поля из разных строк.
Синтаксис
SELECT CONCAT_WS(разделитель, поле1, поле2...) FROM имя_таблицы WHERE условиеПримеры
Все примеры будут по этой таблице workers, если не сказано иное:
1 | Дима | 23 | 300 |
2 | Петя | 24 | 400 |
3 | Вася | 25 | 500 |
Пример
В данном примере при выборке из базы создается новое поле concat_ws, в котором одновременно сольются через дефис 3 поля - age, name и salary:
SQL запрос выберет следующие строки:
1 | Дима | 23 | 300 | 23-Дима-300 |
2 | Петя | 24 | 400 | 24-Петя-400 |
3 | Вася | 25 | 500 | 25-Вася-500 |
Пример
А теперь кроме полей из базы добавится еще и строка '!!!':
SELECT *, CONCAT_WS('-', age, '!!!', salary) as concat_ws FROM workersSQL запрос выберет следующие строки:
1 | Дима | 23 | 300 | 23-!!!-300 |
2 | Петя | 24 | 400 | 24-!!!-400 |
3 | Вася | 25 | 500 | 25-!!!-500 |
Меняем таблицу для примеров
Остальные примеры будут по этой таблице workers:
1 | 23 | 300 | - | |
2 | Петя | 24 | 400 | @ |
3 | Вася | 25 | 500 | ! |
Пример
Разделителем может быть не только строка, но и поле таблицы. Давайте сделаем содержимое поля separator разделителем между age, name, salary:
SELECT *, CONCAT_WS(separator, age, name, salary) as concat_ws FROM workersSQL запрос выберет следующие строки:
1 | Дима | 23 | 300 | - | 23-Дима-300 |
2 | Петя | 24 | 400 | @ | 24@Петя@400 |
3 | Вася | 25 | 500 | ! | 25!Вася!500 |
code.mu
Конкатенация в SQL-запросах
Виды конкатенации
Определение 1
Конкатенацией называется операция, которая позволяет соединить несколько текстовых строк в одну.
В работе с базами данных конкатенация используется, когда нужно соединить значения нескольких полей или присоединить к значениям полей текст.
В SQL используется три вида конкатенации:
- Простая конкатенация;
- Конкатенация с разделителем;
- Групповая конктенация.
В различных "диалектах" языка SQL функции, реализующие конкатенацию, несколько различаются своим синтаксисом. Но принципы их работы одинаковы. Эти принципы будут рассмотрены на примере функций СУБД MySQL.
Простая конкатенация
Простая конкатенация в СУБД MySQL выполняется с помощью встроенной функции CONCAT() имеющей следующий синтаксис:
CONCAT(строка1, строка2, ……строкаN)
Строки, являющиеся аргументами функции, могут быть именами полей, а могут быть текстовыми строками в кавычках.
Пример 1
В качестве примера рассмотрим запрос:
SELECT concat("Абитуриент ", fio, " возрастом ", age, " рекомендован(a) к зачислению") as text1 FROM abiturient;
Результатом запроса будет собранный из кусочков текст:
Конкатенация с разделителем
Этот вид конкатенации в MySQL выполняется с помощью функции CONCAT_WS(), имеющей следующий синтаксис:
CONCAT_WS(‘символ_разделитель’, строка1, строка2…)
В этом случае между соединяемыми строками будет установлен символ-разделитель.
Пример 2
Например, в данном запросе в качестве разделителя используется запятая:
SELECT concat_ws(',', fio,age,gender) as text1 FROM abiturient;
Результат:
Если в качестве разделителя использовать пустую строку, то результат будет полностью совпадать с результатом простой конкатенации. Если разделителем должен быть символ кавычки ', то его нужно экранировать обратным слешем – '\''.
Пример 3
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().
Пример 4
Таким образом, для получения списка специальностей по каждому абитуриенту нужно выполнить следующий запрос:
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;
spravochnick.ru
Функция GROUP_CONCAT - сложение разных строк таблицы
Функция GROUP_CONCAT складывает (как строки) содержимое одного поля из разных строк, вставляя между ними разделитель (по умолчанию это запятая).
К примеру, можно получить список всех выбранных имен через запятую или другой разделитель.
Внимание: у этой функции есть ограничение на объем выводимых данных. По умолчанию 1024 символа для каждого объединения - для каждой выводимой строки. Если размер склеенных данных больше, то он будет урезаться.
Чтобы расширить размер нужно выполнить команду SET group_concat_max_len = 4096;
Если у вас есть привилегии, то вы расширите объем получаемых данных до 4096, можно и больше. Но чаще всего на обычных хостингах таких привилегий нет.
См. также команду GROUP BY, с помощью которой можно группировать строки для использования GROUP_CONCAT.
См. также функции CONCAT и CONCAT_WS которые складывают колонки одной строки.
Синтаксис
Без указания разделителя (по умолчанию это будет запятая):
SELECT GROUP_CONCAT(поле) FROM имя_таблицы WHERE условиеС указанием разделителя:
SELECT GROUP_CONCAT(поле SEPARATOR разделитель) FROM имя_таблицы WHERE условиеПримеры
Все примеры будут по этой таблице workers, если не сказано иное:
1 | Дима | 23 |
2 | Петя | 23 |
3 | Вася | 23 |
4 | Коля | 24 |
5 | Иван | 24 |
6 | Кирилл | 25 |
Пример
В данном примере запрос находит все имена в таблицы и выводит их через запятую:
SELECT GROUP_CONCAT(name) as name FROM workersSQL запрос выберет следующие строки:
Дима,Петя,Вася,Коля,Иван,Кирилл |
Пример
В данном примере разделитель меняется на '+' с помощью команды SEPARATOR:
SELECT GROUP_CONCAT(name SEPARATOR '+') as name FROM workersSQL запрос выберет следующие строки:
Дима+Петя+Вася+Коля+Иван+Кирилл |
Пример
В данном примере с помощью команды WHERE выбираются не все строки, а заданные:
SELECT GROUP_CONCAT(name) as name FROM workers WHERE id>=3 AND idSQL запрос выберет следующие строки:
Вася,Коля,Иван |
Пример
В данном примере с помощью команды GROUP BY строки группируются по возрасту и для каждой группы через запятую выводятся имена работников с таким возрастом:
SELECT age, GROUP_CONCAT(name) as name FROM workers GROUP BY ageSQL запрос выберет следующие строки:
23 | Дима,Петя,Вася |
24 | Коля,Иван |
25 | Кирилл |
Пример
Поменяем разделитель на '-':
SELECT age, GROUP_CONCAT(name SEPARATOR '-') as name FROM workers GROUP BY age23 | Дима-Петя-Вася |
24 | Коля-Иван |
25 | Кирилл |
code.mu
sql - SQL Query для конкатенации значений столбцов из нескольких строк в Oracle
Для тех, кто должен решить эту проблему с использованием Oracle 9i (или ранее), вам, вероятно, потребуется использовать SYS_CONNECT_BY_PATH, поскольку LISTAGG недоступен.
Чтобы ответить на OP, следующий запрос отобразит PID из таблицы A и соедините все столбцы DESC из таблицы B:
SELECT pid, SUBSTR (MAX (SYS_CONNECT_BY_PATH (description, ', ')), 3) all_descriptions FROM ( SELECT ROW_NUMBER () OVER (PARTITION BY pid ORDER BY pid, seq) rnum, pid, description FROM ( SELECT a.pid, seq, description FROM table_a a, table_b b WHERE a.pid = b.pid(+) ) ) START WITH rnum = 1 CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR pid = pid GROUP BY pid ORDER BY pid;Также могут быть случаи, когда ключи и значения содержатся в одной таблице. Следующий запрос может быть использован там, где нет таблицы A, и существует только таблица B:
Все значения могут быть переупорядочены по желанию. Отдельные конкатенированные описания могут быть переупорядочены в предложении PARTITION BY, и список PID может быть переупорядочен в конечном предложении ORDER BY.
Альтернативно: могут быть моменты, когда вы хотите объединить все значения из всей таблицы в одну строку.
Основная идея здесь заключается в использовании искусственного значения для группы описаний, которые должны быть объединены.
В следующем запросе используется константа '1', но любое значение будет работать:
SELECT SUBSTR (MAX (SYS_CONNECT_BY_PATH (description, ', ')), 3) all_descriptions FROM ( SELECT ROW_NUMBER () OVER (PARTITION BY unique_id ORDER BY pid, seq) rnum, description FROM ( SELECT '1' unique_id, b.pid, b.seq, b.description FROM table_b b ) ) START WITH rnum = 1 CONNECT BY PRIOR rnum = rnum - 1;Несколько других ответов на этой странице также упомянули об этой чрезвычайно полезной ссылке: https://oracle-base.com/articles/misc/string-aggregation-techniques
qaru.site