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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top