Конкатенация в SQL-запросах. Sql concat описание


Функция CONCAT_WS - сложение строк с разделителем

Функция CONCAT_WS предназначена для сложения строк при выборке из базы данных с использованием разделителя. Строками обычно выступают поля таблиц.

См. также функцию CONCAT, которая складывает строки без использования разделителя.

См. также функцию GROUP_CONCAT, которая складывает содержимое одного поля из разных строк.

Синтаксис

SELECT CONCAT_WS(разделитель, поле1, поле2...) FROM имя_таблицы WHERE условие

Примеры

Все примеры будут по этой таблице workers, если не сказано иное:

id айди name имя age возраст salary зарплата
1 Дима 23 300
2 Петя 24 400
3 Вася 25 500

Пример

В данном примере при выборке из базы создается новое поле concat_ws, в котором одновременно сольются через дефис 3 поля - age, name и salary:

SELECT *, CONCAT_WS('-', age, name, salary) as concat_ws FROM workers

SQL запрос выберет следующие строки:

id айди name имя age возраст salary зарплата concat_ws объединенное поле
1 Дима 23 300 23-Дима-300
2 Петя 24 400 24-Петя-400
3 Вася 25 500 25-Вася-500

Пример

А теперь кроме полей из базы добавится еще и строка '!!!':

SELECT *, CONCAT_WS('-', age, '!!!', salary) as concat_ws FROM workers

SQL запрос выберет следующие строки:

id айди name имя age возраст salary зарплата concat_ws объединенное поле
1 Дима 23 300 23-!!!-300
2 Петя 24 400 24-!!!-400
3 Вася 25 500 25-!!!-500

Меняем таблицу для примеров

Остальные примеры будут по этой таблице workers:

id айди name имя age возраст salary зарплата separator разделитель
1
Дима
23 300 -
2 Петя 24 400 @
3 Вася 25 500 !

Пример

Разделителем может быть не только строка, но и поле таблицы. Давайте сделаем содержимое поля separator разделителем между age, name, salary:

SELECT *, CONCAT_WS(separator, age, name, salary) as concat_ws FROM workers

SQL запрос выберет следующие строки:

id айди name имя age возраст salary зарплата separator разделитель concat_ws объединенное поле
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, если не сказано иное:

id айди name имя age возраст
1 Дима 23
2 Петя 23
3 Вася 23
4 Коля 24
5 Иван 24
6 Кирилл 25

Пример

В данном примере запрос находит все имена в таблицы и выводит их через запятую:

SELECT GROUP_CONCAT(name) as name FROM workers

SQL запрос выберет следующие строки:

name имена
Дима,Петя,Вася,Коля,Иван,Кирилл

Пример

В данном примере разделитель меняется на '+' с помощью команды SEPARATOR:

SELECT GROUP_CONCAT(name SEPARATOR '+') as name FROM workers

SQL запрос выберет следующие строки:

name имена
Дима+Петя+Вася+Коля+Иван+Кирилл

Пример

В данном примере с помощью команды WHERE выбираются не все строки, а заданные:

SELECT GROUP_CONCAT(name) as name FROM workers WHERE id>=3 AND id

SQL запрос выберет следующие строки:

name имена
Вася,Коля,Иван

Пример

В данном примере с помощью команды GROUP BY строки группируются по возрасту и для каждой группы через запятую выводятся имена работников с таким возрастом:

SELECT age, GROUP_CONCAT(name) as name FROM workers GROUP BY age

SQL запрос выберет следующие строки:

age возраст name имена
23 Дима,Петя,Вася
24 Коля,Иван
25 Кирилл

Пример

Поменяем разделитель на '-':

SELECT age, GROUP_CONCAT(name SEPARATOR '-') as name FROM workers GROUP BY age

SQL запрос выберет следующие строки:

age возраст name имена
23 Дима-Петя-Вася
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:

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 pid, seq, description FROM table_b ) ) START WITH rnum = 1 CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR pid = pid GROUP BY pid ORDER BY pid;

Все значения могут быть переупорядочены по желанию. Отдельные конкатенированные описания могут быть переупорядочены в предложении 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;

Индивидуальные конкатенированные описания могут быть переупорядочены в предложении PARTITION BY.

Несколько других ответов на этой странице также упомянули об этой чрезвычайно полезной ссылке: https://oracle-base.com/articles/misc/string-aggregation-techniques

qaru.site