Group_Concat в Concat не работает со значениями NULL

у меня есть стол

CREATE TABLE IF NOT EXISTS `dept` (
  `did` int(11) NOT NULL,
  `dname` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `dept` (`did`, `dname`) VALUES
(1, 'Hi'),
(2, NULL),
(3, 'Hello');

Тогда у меня есть запрос

select group_concat(concat(did,"','",dname) separator '),(') as Result from dept

Это дает результат как 1','Hi'),('3','Hello

Вопрос: как я могу получить результат из приведенного выше запроса как 1','Hi'),('2','NULL'),('3','Hello

Отсутствуют строки со значениями NULL, но мне нужно получить все

Ссылка на демо SQL Fiddle с вопросом

ОБНОВЛЕНИЕ: Если у меня есть несколько или все столбцы, допускающие NULL, есть ли способ применить COALESCE один раз для всех или его нужно применять отдельно для каждого столбца?


person Sami    schedule 29.09.2012    source источник
comment
У меня есть еще один пример groupconcat в concat stackoverflow.com/questions/13451605/   -  person Sami    schedule 18.01.2016


Ответы (3)


попробуйте это, используйте COALESCE

.., COALESCE(dname, 'NULL'),..

делая видимой NULL строку. ДЕМО SQLFIDDLE

person John Woo    schedule 29.09.2012
comment
Пожалуйста, объясните, если два или все столбцы могут иметь значения NULL, тогда мне нужно использовать COALESCE с каждым столбцом или есть какой-то способ сделать это один раз для всех? - person Sami; 29.09.2012
comment
к сожалению, нет, вам нужно отдельно добавить COALESCE в каждый столбец. - person John Woo; 29.09.2012

Из документации по агрегатным функциям MySQL:

Если не указано иное, групповые функции игнорируют значения NULL.

Используйте COALESCE(), чтобы заменить нули строкой. , так как они будут устранены агрегатной функцией. Например, COALESCE(dbname, 'NULL') вернет строку NULL, если dbname IS NULL. Его цель — вернуть первый ненулевой аргумент, который вы ему задали, и поэтому он может вернуть значение по умолчанию.

SELECT
  GROUP_CONCAT(CONCAT(did,"','", COALESCE(dname, 'NULL')) SEPARATOR "'),('") AS Result
FROM dept
person Michael Berkowski    schedule 29.09.2012
comment
Ваше решение довольно хорошо объяснено и приемлемо. Пожалуйста, просто замените разделитель '),(' на "'),('", как я сделал это в вопросе и демонстрации sqlfiddle - person Sami; 29.09.2012
comment
@Sami отредактировал выше. Вы также можете избежать одинарных кавычек, как в '\'),(\'' - person Michael Berkowski; 29.09.2012

Надеюсь, что следующий запрос будет служить вашей цели

SELECT GROUP_CONCAT(
IF(dname IS NOT NULL, CONCAT(did,"','",dname), CONCAT(did,"','NULL")) 
SEPARATOR '),(') AS Result FROM dept
person jsist    schedule 29.09.2012