如何返回文本默认语言

问题描述:

我有这样的表:在语言表 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 

谢谢。

+0

发现看到这一点:http://*.com/questions/3238651/retrieving-i18n-data-with-fallback-language/3238734#3238734 –

+0

@KM的语言数量可改变了,我还没有改变查询结构 – garik

+0

也许我错过了一些东西(我看不到你的图片,他们被网络警察阻止),如果请求的语言不存在,链接中的查询将返回默认语言。系统中是否有20种语言并不重要,您基本上是在两种语言之间进行选择:请求语言和默认语言。 –

我认为你提供的数据中有些东西搞砸了。您是不是想要在TextId = 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; 

如果不是这种情况,就需要使问题更加清晰。如果您的语言ID为4,DefualtId = 3的“中心乌克兰语”,那么当请求该语言时,查询应该检查文本表为4,如果没有找到,它会检查4的默认值(3),如果没有找到,它会检查3的默认值(2),如果没有找到它,它会检查2的默认值(1),最后返回1。如果是这种情况,您肯定需要更复杂的查询(使用递归CTE或循环)。

对于语言代码,您应该使用NCHAR(2)而不是NVARCHAR(2)。我希望这个专栏不是可以空的和独一无二的。

+0

+1,基于我对OP情况的理解,这就是我该怎么做的 –

+0

它不起作用:( – garik

+0

你需要更具体一点 –