Как я мог передать разделитель в качестве переменной в MySQL GROUP_CONCAT? - PullRequest
0 голосов
/ 19 ноября 2018

Я хотел бы передать значение SEPARATOR для GROUP_CONTACT как переменную (или параметр функции), однако этот код завершится ошибкой

SET @sep = ' ';
SELECT
    `group`,
    GROUP_CONCAT( `field` ORDER BY `idx` SEPARATOR @sep ) `fields`
FROM `table`
GROUP BY `group`;

Я знаю, что могу сделать что-то вроде

SELECT
    `group`,
    SUBSTRING(
      GROUP_CONCAT( CONCAT(`field`,@sep) ORDER BY `idx` SEPARATOR ''),
      1,
      LENGTH(
        GROUP_CONCAT( CONCAT(`field`,@sep) ORDER BY `idx` SEPARATOR '')
      )-LENGTH(@sep)
    ) `fields`
FROM `table`
GROUP BY `group`;

Но было бы лучше иметь более краткий синтаксис.


Edit:

SELECT
    `group`,
    SUBSTRING(
      GROUP_CONCAT( CONCAT(@sep,`field`) ORDER BY `idx` SEPARATOR ''),
      LENGTH(@sep)+1
    ) `fields`
FROM `table`
GROUP BY `group`;

Немного проще, но недостаточно удовлетворительно.

1 Ответ

0 голосов
/ 19 ноября 2018

Вы можете использовать подготовленный оператор:

SET @sep = '**';
SET @sql = CONCAT('SELECT `group`, GROUP_CONCAT( `field` ORDER BY `idx` SEPARATOR "',
@sep, '") `fields` FROM `table` GROUP BY `group`');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Я создал небольшую демонстрацию для dbfiddle :

create table `table` (idx int auto_increment primary key, field varchar(10), `group` int);
insert into `table` (field, `group`) values
('hello', 4),
('world', 4),('today', 4),('hello', 3),('world', 3),
('hello', 5),('today', 5),('world', 5),('goodbye', 5)

Вывод подготовленного оператора:1009 *

group   fields
3       hello**world
4       hello**world**today
5       hello**today**world**goodbye
...