Как вернуть текст для языка по умолчанию - PullRequest
0 голосов
/ 18 августа 2011

У меня есть такие таблицы: enter image description here

и т. Д. В таблице языков:

enter image description here

и т. Д. В текстовой таблице: enter image description here

Я должен вернуть текст для запрошенного языка, если он существует , и текст для по умолчанию языка, если он не существует ,Можно ли сделать это в одном запросе (не while, пожалуйста)?

Код:

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 18 августа 2011

Я предполагаю, что что-то напутано в предоставленных вами данных.Разве вы не хотели показывать строку в текстовой таблице с LanguageId = 2?Без использования рекурсивного запроса или цикла вы не сможете продолжать следовать DefaultId языка, пока не окажетесь на английском.Предполагая, что в текстовой таблице есть строка для резервной копии украинского языка (2 = русский):

DECLARE 
    @CommentId BIGINT = 1,
    @LanguageCode NVARCHAR(2) = 'ua';

SELECT
    CommentId           = COALESCE(t.CommentId,  a.CommentId),
    TextId              = COALESCE(t.TextId,     a.TextId),
    [Text]              = COALESCE(t.[Text],     a.[Text]), 
    LanguageId          = COALESCE(t.LanguageId, a.LanguageId),
    RequestedLanguageId = @LanguageCode
FROM 
    dbo.common_LanguageType AS l
LEFT OUTER JOIN 
    dbo.common_Text AS t
    ON l.LanguageId = t.LanguageId
    AND t.CommentID = @CommentId
LEFT OUTER JOIN 
    dbo.common_Text AS a -- a for "alternate"
    ON l.DefaultId = a.LanguageId
WHERE
    l.Code = @LanguageCode
    AND a.CommentID = @CommentId;

Если это не так, вам нужно прояснить вопрос.Если у вас есть LanguageId 4, «центральный украинский» с DefualtId = 3, при запросе этого языка запрос должен проверить текстовую таблицу на 4, когда он не найден, он проверяет значение по умолчанию для 4 (3), когда он не найден, он проверяет 3 по умолчанию (2), когда он не найден, он проверяет 2 по умолчанию (1) и, наконец, возвращает строку для 1?В этом случае вам, безусловно, понадобится более сложный запрос (с использованием либо рекурсивного CTE, либо цикла).

Также для кода языка вам, вероятно, следует использовать NCHAR(2) вместо NVARCHAR(2).Надеюсь, колонка не обнуляемая и не уникальная.

0 голосов
/ 19 августа 2011
...