Cambiar el DONDE para una selección en una sola fila en función del contenido del campo
-
22-08-2019 - |
Pregunta
Ok, esto puede sonar un poco raro, pero lo que tengo que hacer es simple. Tengo una lista de empresas y cada uno tiene una descripción. El sitio está en 4 idiomas. Mi problema viene cuando he enumerado una empresa en Inglés, pero la persona que se encarga de traducirlo en francés todavía no hizo la traducción, así que tengo un simple:
SELECT TOP(6)
company.name,
company.description,
company.address
WHERE
langid=1
ORDER BY
company.id DESC
La consulta real es más complejo, pero creo que será más fácil con éste para entender el problema. Lo que tengo que hacer es, cuando la descripción está vacío en langid 2 luego me la langid 1 muestran como langid 1 siempre es el primero que se añadirá. No quiero para mostrar el campo de descripción vacía.
Imagínese fila 1, fila 2, fila 3 y la fila 5 tienen una descripción para langid 2 pero no la fila 4 y la fila 6. I necesidad de mostrar langid 2 para las filas que contienen, pero LANGID 1 para las filas con hay descripción.
Sé que probablemente podría hacer un tiempo con un campo @i incrementando e insertar el resultado de una en una en una tabla temporal, pero ¿hay alguna forma mejor de hacerlo?
Solución
Esto funcionará a menos que haya lng1.name
etc (es decir, el idioma Inglés / variante de retorno) que faltan.
SELECT TOP(6)
COALESCE(lng2.name, lng1.name) [name],
COALESCE(lng2.description, lng1.description) description,
COALESCE(lng2.address , lng1.address ) address
FROM
company lng1
LEFT JOIN company lng2 ON
lng1.id = lng2.id AND
lng1.langid = 1 AND
lng2.langid = 2 /* your "foreign language" id, e.g. a parameter */
WHERE
lng1.id IN (1,2,3,4,5,6) /* or whatever */
ORDER BY
lng1.id DESC
Será tampoco sustituir toda la dirección con la versión Inglés / alternativa en caso de sólo una parte de la variante localizada no se encuentra. serán sustituidos Solamente las partes que faltan.