2 Stimmen

SQL-Abfrage zu einer Bedingung

Ich schreibe eine Abfrage, um übersetzte Inhalte abzurufen. Ich möchte, dass, wenn es keine Übersetzung für die angegebene Sprache id, es automatisch die Übersetzung für die Standardsprache, mit Id 1 zurückgibt.

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.

Ich arbeite mit MS SQL, aber ich denke, die Theorie ist nicht DBMS-spezifisch.

Vielen Dank im Voraus.

3voto

gbn Punkte 407102

Dies setzt voraus eine nur eine Zeile pro Übersetzung, je nachdem, wie Sie die Frage formuliert haben. Wenn Sie mehrere Zeilen pro FkLanguageId haben und ich das falsch verstanden habe, lassen Sie es uns bitte wissen und die Abfrage wird natürlich komplexer

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

In einem anderen RDBMS würden Sie LIMIT verwenden

3voto

Martin Smith Punkte 417623

Angenommen, die Tabelle enthält verschiedene Phrasen, gruppiert nach 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

1voto

Philip Kelley Punkte 38051

Dies setzt das Vorhandensein eines Übersetzungsschlüssels voraus, der ein "Thema" mit mehreren verschiedenen Übersetzungssprachen verknüpft:

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

0voto

maycil Punkte 744

Vielleicht ist dies eine schmutzige Lösung, aber sie kann Ihnen helfen

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

0voto

Sir Wobin Punkte 1060

Da Ihr Verweis auf pastie.org zeigt, dass Sie in einer Tabelle nach Phrasen oder bestimmten Menüpunktnamen suchen, gehe ich davon aus, dass es eine Phrasen-ID gibt, um die fraglichen Phrasen zu identifizieren.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X