Eu tenho então tabelas:
e assim dados na tabela Language:
e assim dados na tabela Text:
Eu tenho que retornar o texto para o idioma solicitado , se existir , e o texto para o idioma padrão , se não existir . É possível fazer isso em uma consulta (não while
, por favor)?
Código:
DECLARE @CommentId bigint = 1
--DECLARE @LanguageCode nvarchar(2) = 'en' -- "english text" returns
DECLARE @LanguageCode nvarchar(2) = 'ua' -- nothing at this moment
SELECT
t.CommentId
,t.TextId
,t.[Text]
,t.LanguageId
,RequestedLanguageId = @LanguageCode
FROM dbo.common_Text t
INNER JOIN dbo.common_LanguageType l
ON t.LanguageId = l.LanguageId
WHERE l.Code = @LanguageCode
AND t.CommentId = @CommentId
Obrigada.
ADICIONADO:
Se o código solicitar um texto em 'ua' (ucraniano) e este não for nenhum texto para este idioma, ele irá procurar texto para russo. se encontrado - ok, caso contrário, ele procurará um texto para inglês. A lista de idiomas pode variar.
Usando um CTE recursivo, esta consulta cria uma tabela de todos os idiomas que apontam em algum lugar em sua cadeia padrão para um idioma que tenha o comentário necessário. Ele mostra cada idioma ao lado de seu primeiro padrão que possui o comentário necessário. Em seguida, ele filtra essa tabela para fornecer o primeiro texto disponível para o idioma selecionado.
Tente apenas correr
se você quiser ter uma ideia do que o CTE recursivo está fazendo. Carreguei um script para criar as tabelas, inserir alguns dados de amostra e executar o código acima para gist .