2011-05-08 22 views
5

Decir que tengo la siguiente tabla:SQL: ¿Cómo devolver una fila no existente?

================================================= 
| color_id | parent_id | language_id | name  | 
================================================= 
| 1  | 50  | 1   | Black | 
------------------------------------------------- 

Luego dicen que necesito la fila WHERE parent_id = 50 AND language_id = 2. Obviamente, no obtendría nada en función de mi tabla de ejemplos. Sin embargo, todavía necesito un resultado, probablemente algo como esto:

================================================= 
| color_id | parent_id | language_id | name  | 
================================================= 
| NULL  | 50  | 2   | NULL  | 
------------------------------------------------- 

¿Hay alguna manera de hacer esto en SQL?

+0

Por curiosidad, ¿por qué hacer esto? Es una pregunta interesante, pero me cuesta pensar en una razón para ello. – David

+1

@David: Para manejar un valor predeterminado ... –

+1

@David: OMG Ponies tiene razón. Intento usar COALESCE para hacer traducciones de idiomas (por ejemplo, si 'name' existe para un idioma en particular, entonces úselo; de lo contrario, use el primer 'nombre' no NULO que exista). El problema es cuando la fila para un idioma en particular no existe, entonces no puedo usar COALESCE. Si obtengo una fila con los valores NULL, entonces puedo usar mi solución COALESCE. – StackOverflowNewbie

Respuesta

7

Se podría hacer una consulta de unión de ambos el registro potencialmente válidos y su defecto, a continuación, seleccione la primera:

SELECT * FROM 
(SELECT color_id, parent_id, language_id, name, 1 as order_rank 
FROM some_table 
WHERE parent_id = %parent_id% AND language_id = %language_id% 
UNION 
SELECT NULL, %parent_id%, %language_id%, NULL, 2 as order_rank 
) 
ORDER BY order_rank 
LIMIT 1 

(editada con valor estático para ordenar según lo sugerido por OMG ponis)

+0

+1 muy buena solución – Johan

+0

Estoy seguro de que hay algo con IF o CASE, pero la sintaxis de MySQL no es el sabor al que estoy acostumbrado. – MPelletier

+0

+1: Lo único que agregaría sería un valor estáticamente definido para ordenar por, para asegurar que se devuelva la fila correcta cuando existe el valor buscado. –

0

intente trabajar con la instrucción LEFT JOIN. Probablemente no esté haciendo esto al 100%, pero un poco de prueba y error de su parte debería hacer que esto funcione.

SELECT table1.field1, table1.field2, table2.field3, table2.field4 
FROM my_table table1 
LEFT JOIN my_table table2 ON table1.field1=table2.field1 OR table1.field2=table2.field2 
0

una combinación a la izquierda en una tabla de valor fijo forzado DEBERÍA funcionar.

select 
     YourTable.color_id, 
     ForcedSQL1Record.parent_id, 
     ForcedSQL1Record.language_id, 
     YourTable.name 
    from 
     (select 50 as Parent_ID, 
       2 as Language_ID 
      from YourTable 
      limit 1) ForcedSQL1Record 
     left join 
     YourTable 
      on ForcedSQL1Record.Parent_ID = YourTable.Parent_ID 
      AND ForcedSQL1Record Language_ID = YourTable.Language_ID 
Cuestiones relacionadas