2010-12-08 39 views
2

J'écris une requête pour récupérer du contenu traduit. Je veux donc que s'il n'y a pas une traduction pour l'identificateur de langue donnée, elle renvoie automatiquement la traduction de la langue par défaut, avec Id 1.Requête SQL sur une condition

select Translation.Title 
     ,Translation.Summary 
from Translation 
where Translation.FkLanguageId = 3 

-- If there is no LanguageId of 3, select the record with LanguageId of 1. 

Je travaille dans MS SQL mais je pense que le la théorie n'est pas spécifique au SGBD.

Merci d'avance.

+0

Quelle saveur de SGBDR? –

+0

Je travaille en MS SQL mais je ne pense pas que cela a fait une grande différence car c'est juste la logique que je voudrais aider avec – Greg

+0

Comment sont groupées les traductions "identiques"? –

Répondre

3

Cela suppose une ligne par traduction uniquement, en fonction de la façon dont vous avez formulé la question. Si vous avez plusieurs lignes par FkLanguageId et je l'ai mal compris, s'il vous plaît laissez-nous savoir et la requête devient plus complexe bien sûr

select TOP 1 
    Translation.Title 
    ,Translation.Summary 
from 
    Translation 
where 
    Translation.FkLanguageId IN (1, 3) 
ORDER BY 
    FkLanguageId DESC 

Vous utiliseriez LIMIT dans un autre SGBDR

+0

Bonne réponse, s'il vous plaît pourriez-vous expliquer comment cela serait intégré dans une requête plus compliquée, comme ceci: http://pastie.org/1359177 – Greg

+1

@Greg: Voir la réponse de Martin qui permet plusieurs lignes par ID. – gbn

0

Peut-être que c'est une solution sale , mais il peut vous aider à

if not exists(select t.Title ,t.Summary from Translation t where t.FkLanguageId = 3) 
    select t.Title ,t.Summary from Translation t where t.FkLanguageId = 1 
else 
    select t.Title ,t.Summary from Translation t where t.FkLanguageId = 3 
3

en supposant que la table contient différentes expressions groupées par PhraseId

WITH Trans As 
(
select Translation.Title 
     ,Translation.Summary 
     ,ROW_NUMBER() OVER (PARTITION BY PhraseId ORDER BY FkLanguageId DESC) RN 
from Translation 
where Translation.FkLanguageId IN (1,3) 
) 
SELECT * 
FROM Trans WHERE RN=1 
0

Puisque votre référence à pastie.org montre que vous recherchez des phrases ou des noms d'éléments de menu spécifiques dans une table, je vais supposer qu'il y a un ID de phrase pour identifier les phrases en question.

SELECT ISNULL(forn_lang.Title, default_lang.Title) Title, 
     ISNULL(forn_lang.Summary, default_lang.Summary) Summary 
FROM Translation default_lang 
LEFT OUTER JOIN Translation forn_lang ON default_lang.PhraseID = forn_lang.PhraseID AND forn_lang.FkLanguageId = 3 
WHERE default_lang.FkLanguageId = 1 
+0

Vous auriez besoin de déplacer la condition "= 3" vers le JOIN: ceci est un INNER JOIN tel qu'il est – gbn

+0

Exactement! Je n'ai pas pensé ça correctement. –

1

Cela suppose l'existence d'un TranslationKey qui associe un « sujet » avec plusieurs langues de traduction différentes:

SELECT 
    isnull(tX.Title, t1.Title)  Title 
,isnull(tX.Summary, t1.Summary) Summary 
from Translation t1 
left outer join Translation tX 
    on tx.TranslationKey = t1.Translationkey 
    and tx.FkLanguageId = @TargetLanguageId 
where t1.FkLanguageId = 1 -- "Default