如何返回默认语言的文本

时间:2011-08-18 17:45:04

标签: tsql sql-server-2008 common-table-expression

我有这样的表: 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 个答案:

答案 0 :(得分:3)

我认为你提供的数据中有些东西搞砸了。你不是要在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)。我希望这个专栏不是可空和独特的。

答案 1 :(得分:0)

Database Administrators site

上找到了解决方案