Mysql: ¿Cómo completo valores nulos en una fila con valores de otra fila en la misma tabla?

Tengo una tabla con una columna de identificación que hace referencia a una fila de la misma tabla que representa un conjunto de valores predeterminados que la fila debe devolver si alguno de los valores es NULL. Por ejemplo:

'content'
id | a   | b   | default_id
----------------------------------
1  | 33  | 55  | NULL
2  | NULL| 11  | 1

Así que quiero consultar la fila 2 de manera que obtenga un resultado con 'a' = 33 y 'b' = 11. ¿Hay alguna forma sencilla de hacer esto?

preguntado el 08 de enero de 11 a las 23:01

¿Cuál es la relación entre las filas 1 y 2? -

¿Es esto para un número limitado de columnas o está buscando una solución genérica para n columnas? -

Ronnis: La fila 2 tiene un 'default_id' de 1, por lo que quiero que las columnas vacías en la fila 2 se llenen con los valores de la fila 1. -

Cada fila tendrá un 'default_id' diferente y podría haber muchos registros devueltos, cada uno de los cuales debe llenarse con sus respectivos valores predeterminados. -

Brett: Una solución genérica para n columnas, sí. Aunque estoy generando la consulta mediante programación, por lo que si tuviera que combinar algunos nombres de columna, está bien siempre que funcione para todos y pueda hacerlos todos a la vez. -

3 Respuestas

Es posible que desee utilizar el COALESCE() función, que devuelve el primer valor no NULO en la lista:

SELECT      COALESCE(c1.a, c2.a) a ,
            COALESCE(c1.b, c2.b) b
FROM        content c1
LEFT JOIN   content c2 ON (c2.id = c1.default_id)
WHERE       c1.id = 2;

Caso de prueba:

CREATE TABLE content (id int, a int, b int, default_id int);
INSERT INTO content VALUES (1, 33, 55, NULL);
INSERT INTO content VALUES (2, NULL, 11, 1);

Resultado:

+------+------+
| a    | b    |
+------+------+
|   33 |   11 |
+------+------+
1 row in set (0.00 sec)

Respondido el 09 de enero de 11 a las 03:01

la condición de unión probablemente debería ser c2.id = c1.default_id. - Oswald

¡Gracias! Exactamente lo que estaba buscando. - prisma de todo

select t1.id
      ,coalesce(t1.a, t2.a) as a
      ,coalesce(t1.b, t2.b) as b
  from content t1 
  left outer 
  join content t2 on(t1.default_id = t2.id)
 where t1.id = 2;

Respondido el 09 de enero de 11 a las 02:01

SELECT t1.id, IFNULL(t1.a, t2.a), IFNULL(t1.b,t2.b)
FROM content t1
LEFT JOIN content t2 ON (t2.id = t1.default_id)
WHERE t1.id = 2

Respondido el 09 de enero de 11 a las 02:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.