我有这样的表:
语言表中的等数据:
等文本表中的数据:
如果存在,则必须返回请求的语言的文本,如果不存在,则必须返回默认语言的文本。是否可以在一个查询中执行此操作(请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 :(得分: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)