如何返回文本默认语言
问题描述:
我有这样的表:在语言表 如何返回文本默认语言
等数据:
,并因此在文本表中的数据:
我必须返回要求的文本语言如果它存在和文本默认语言如果它不存在。是否有可能在之一,查询(请不要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
谢谢。
答
我认为你提供的数据中有些东西搞砸了。您是不是想要在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)
。我希望这个专栏不是可以空的和独一无二的。
发现看到这一点:http://*.com/questions/3238651/retrieving-i18n-data-with-fallback-language/3238734#3238734 –
@KM的语言数量可改变了,我还没有改变查询结构 – garik
也许我错过了一些东西(我看不到你的图片,他们被网络警察阻止),如果请求的语言不存在,链接中的查询将返回默认语言。系统中是否有20种语言并不重要,您基本上是在两种语言之间进行选择:请求语言和默认语言。 –