Alterar o ONDE para uma escolha em apenas uma linha, dependendo do conteúdo do campo
-
22-08-2019 - |
Pergunta
Ok, isso pode soar um pouco estranho, mas o que eu preciso fazer é simples. Eu tenho uma lista de empresas e cada um tem uma descrição. O site está em 4 idiomas. Meu problema surge quando eu listei uma empresa em Inglês, mas a pessoa que está a cargo de traduzi-lo em francês ainda não fez a tradução, então eu tenho um simples:
SELECT TOP(6)
company.name,
company.description,
company.address
WHERE
langid=1
ORDER BY
company.id DESC
A consulta real é mais complexa, mas eu acho que vai ser mais fácil com este para entender o problema. O que eu preciso fazer é, quando a descrição está vazia no langid 2, em seguida, mostre-me o langid 1 como langid 1 é sempre o primeiro que será adicionado. Eu não quero mostrar o campo de descrição esvaziar.
Imagine-linha 1, linha 2, linha 3 e linha 5 temos uma descrição para langid 2, mas não linha 4 e linha 6. Eu preciso mostrar langid 2 para as linhas que contêm, mas langid 1 para as linhas com nenhuma descrição.
Eu sei que eu provavelmente poderia fazer um tempo com um campo @i incrementar e inserir os resultados, um por um em uma tabela temporária, mas existe alguma maneira melhor de fazer isso?
Solução
Isto irá funcionar a menos que haja lng1.name
etc. (ou seja, o idioma Inglês / fallback variante) faltando.
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
Ele também não vai substituir o endereço completo com a versão Inglês / fallback se apenas parte da variante localizada está faltando. Apenas as partes em falta serão substituídos.