2011-04-09 12 views
9

Decir que tengo la siguiente tabla:MySQL: cómo usar COALESCE

TABLE: product 
=============================================================================== 
| product_id | language_id | name   | description      | 
=============================================================================== 
| 1   | 1   | Widget 1  | Really nice widget. Buy it now! | 
------------------------------------------------------------------------------- 
| 1   | 2   | Lorem 1  |         | 
------------------------------------------------------------------------------- 

¿Cómo consultar este ejemplo que pretende dame la name y description donde language_id = 2, pero caer de nuevo a language_id = 1 si la columna contiene un NULL? En el ejemplo anterior, debería obtener Lorem 1 para name y Really nice widget. Buy it now! para description.

Respuesta

8

¿Qué tal esto?

SET @pid := 1, @lid := 2; 
SELECT 
    COALESCE(name,(
     SELECT name 
     FROM product 
     WHERE product_id = @pid AND description IS NOT NULL 
     LIMIT 1 
    )) name, 
    COALESCE(description,(
     SELECT description 
     FROM product 
     WHERE product_id = @pid AND description IS NOT NULL 
     LIMIT 1 
    )) description 
FROM product 
WHERE product_id = @pid 
    AND (language_id = @lid 
    OR language_id = 1) 
ORDER BY language_id DESC 
LIMIT 1; 

donde:

  • @pid: corriente Identificación del producto
  • @lid: actuales lenguaje id
  • Los valores para name y/o description podría ser nula
  • language_id = 2 artículo no podía existe
1
select name, description from product 
where product_id = @pid 
    and name is not null 
    and description is not null 
    and (language_id = @lang or language_id = 1) 
order by language_id desc 

donde @pid es la identificación del producto actual y @lang es la identificación del idioma actual.

La primera fila devuelta contendrá el nombre y la descripción actuales.

Esto supone que la fila language_id = 1 NO contendrá NULL en nombre o descripción.

+0

y cómo maneja esto las columnas NULL? ¿Estará de vuelta en el valor de language_id = 1? – StackOverflowNewbie

+0

Lo siento, no vi el requisito NULO. Editaré el stmt de selección. –

+0

NULLs son valores esperados de las columnas. – StackOverflowNewbie

0
select p2.product_id 
     ,coalesce(p2.name, p1.name, 'No name') as name 
     ,coalesce(p2.description, p1.description, 'No description') as description 
    from product p2 
    left join product p1 on(
     p1.product_id = p2.product_id 
    and p1.language_id = 1 
) 
where p2.product_id = 1 
    and p2.language_id = 2; 

Edit1:
La consulta anterior asume que el lenguaje = 2 filas existe, pero que el nombre/descr puede ser nulo.

Editar 2.
Acabo de recordar que alguien hizo una pregunta similar recientemente. Y luego descubrí que era que. Debe separar los productos de las traducciones. Eso es lo que hace que esta consulta sea difícil de escribir. Thomas answer hace que sea más fácil hacer lo que quiera.

+3

Amigo esto es realmente un pensamiento horrible. Ve a dormir Ronnis! – Ronnis

+0

¿y si el lenguaje = 2 no existe? No hay garantía de que exista, en realidad. – StackOverflowNewbie

+0

las preguntas fueron diferentes. La pregunta anterior trata sobre el modelado. Thomas brindó una sugerencia sobre cómo modelar y consultar los datos. He decidido utilizar un enfoque de modelado que difiere de la sugerencia de Thomas. Ahora, necesito poder consultar esto de manera similar a la sugerencia de Thomas. – StackOverflowNewbie

0

Suposición: hay una entrada para cada producto con el siguiente texto: language = 1 El código siguiente es simplemente sql simple para recuperar lo que desea.

Otro tema es si desea el comportamiento que solicitó ... porque puede tener idiomas mezclados entre 'nombre' y 'descripción'. Lo diseñaría de manera diferente, si uno de los dos campos está vacío, volvería al idioma principal (1) por defecto.

select p.product_id 
     ,coalesce(pl.name, p.name, 'No name') as name 
     ,coalesce(pl.description, p.description, 'No description') as description 
    from product p 
    left join product pl on (pl.product_id = p.product_id and pl.language_id = :language_id) 
) 
where p.product_id = :product_id and p.language_id = 1 
0

Aquí es un ejemplo del uso con SQL Actualización:

es como equivalente a NVL de Oracle. Puede usarlo como a continuación en una instrucción preparada usando los parámetros

UPDATE 
    tbl_cccustomerinfo 
SET 
    customerAddress = COALESCE(?,customerAddress), 
    customerName = COALESCE(?,customerName), 
    description = COALESCE(?,description) 
WHERE 
    contactNumber=? 
Cuestiones relacionadas