SQL-запрос по условию - PullRequest
       0

SQL-запрос по условию

2 голосов
/ 08 декабря 2010

Я пишу запрос для получения переведенного контента.Я хочу, чтобы при отсутствии перевода для данного идентификатора языка он автоматически возвращал перевод для языка по умолчанию с идентификатором 1.

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.

Я работаю в MS SQL, но ядумаю, что теория не специфична для СУБД.

Заранее спасибо.

Ответы [ 5 ]

3 голосов
/ 08 декабря 2010

Предполагая, что таблица содержит различные фразы, сгруппированные по 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
3 голосов
/ 08 декабря 2010

Это предполагает одну строку только для перевода, в зависимости от того, как вы сформулировали вопрос. Если у вас есть несколько строк на FkLanguageId, и я неправильно понял, пожалуйста, сообщите нам об этом, и запрос, конечно, станет более сложным

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

Вы бы использовали LIMIT в другой СУБД

1 голос
/ 08 декабря 2010

Предполагается существование TranslationKey, который связывает одну «тему» ​​с несколькими различными языками перевода:

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
0 голосов
/ 08 декабря 2010

Поскольку ваша ссылка на pastie.org показывает, что вы ищете в таблице фразы или конкретные названия пунктов меню, я буду предполагать, что для идентификации рассматриваемых фраз есть идентификатор фразы.

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 голосов
/ 08 декабря 2010

Возможно, это грязное решение, но оно может помочь вам

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...