2012-09-29 28 views
8

tengo una mesaGROUP_CONCAT en Concat no se trabaja con valores nulos

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'); 

Entonces tengo una consulta

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

Se está produciendo resultado como 1','Hi'),('3','Hello

Pregunta: ¿Cómo puede Obtengo el resultado de la consulta anterior como 1','Hi'),('2','NULL'),('3','Hello

le falta las filas que tienen valores NULL, pero tengo que ir a buscar todos

Link for SQL Fiddle Demo of question

ACTUALIZACIÓN: Si tengo más de una o todas las columnas para NULL, ¿Hay alguna manera de aplicar COALESCE vez para todos o tiene que aplicar individualmente en cada columna?

+0

tengo otro ejemplo de groupconcat en un concat http://stackoverflow.com/questions/13451605/how-to-use-group-concat- in-a-concat-in-mysql/13451984 # 13451984 – Sami

Respuesta

9

probar esto, utilice COALESCE

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

por lo que es NULL cadena visible. SQLFIDDLE DEMO

+1

Gracias. Lo probaría – Sami

+0

@Sami [haga clic aquí para ver la demostración] (http://sqlfiddle.com/#!2/0d82b/4) –

+0

Indique si dos o todas las columnas pueden tener Los valores NULOS entonces tengo que usar 'COALESCE' con cada columna o hay algún método para hacer esto una vez? – Sami

2

Desde el MySQL aggregate function documentation:

A menos que se indique lo contrario, las funciones de grupo ignoran los valores nulos.

Utilice COALESCE() para reemplazar los nulos con una cadena, ya que serían eliminados por la función de agregado. Por ejemplo, COALESCE(dbname, 'NULL') devolverá la cadena NULL si dbname IS NULL. Su propósito es devolver el primer no nulo de los argumentos que le da, y por lo tanto puede devolver un valor predeterminado.

SELECT 
    GROUP_CONCAT(CONCAT(did,"','", COALESCE(dname, 'NULL')) SEPARATOR "'),('") AS Result 
FROM dept 
+0

Gracias. Lo intentaría – Sami

+0

Su solución está bastante bien explicada y es aceptable. Por favor, solo reemplace el separador ''), (' 'a' "'), ('" 'como lo he hecho en cuestión y demo de sqlfiddle – Sami

+0

@Sami editado arriba. También puede escapar de comillas simples como en'' \ ') , (\ '' ' –

0

Esperanza siguiente consulta servirá su propósito

SELECT GROUP_CONCAT(
IF(dname IS NOT NULL, CONCAT(did,"','",dname), CONCAT(did,"','NULL")) 
SEPARATOR '),(') AS Result FROM dept 
Cuestiones relacionadas