如何获取默认语言的文本
-
16-10-2019 - |
题
我有桌子:
因此在语言表中的数据:
因此,文本表中的数据:
我必须退还文字 要求 语言如果是 存在 和文字 默认 语言如果确实如此 不存在. 。有可能在 一 查询(不 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
谢谢你。
添加:
如果代码在“ ua”(乌克兰人)中请求文本,而这是该语言的任何文本,那么它将搜索俄语文本。如果找到 - 好的,如果不找到,它将寻找英语文字。语言列表可能会有所不同。
解决方案
使用递归CTE,此查询构建了所有语言的表格,这些语言在其默认链中指向具有所需评论的语言。它显示了其第一个默认值旁边的每种语言,该语言具有所需的评论。然后,它过滤了此表,为您提供了您选择的语言的第一个可用文本。
DECLARE @CommentId BIGINT = 1;
DECLARE @LanguageCode NVARCHAR(2) = 'en';
WITH languages AS (
-- base case: language has required comment
SELECT
lt.LanguageId AS RootLanguageId
, lt.LanguageId
, lt.Code
, lt.DefaultId
, 0 AS Level
FROM
dbo.common_LanguageType lt
--WHERE
-- lt.LanguageId = lt.DefaultId
WHERE
EXISTS (
SELECT *
FROM dbo.common_Text t
WHERE
t.CommentId = @CommentId
AND t.LanguageId = lt.LanguageId
)
UNION ALL
-- recursive case: language is not its own default and
-- does not have the required comment
SELECT
l_default.RootLanguageId
, l.LanguageId
, l.Code
, l.DefaultId
, l_default.Level + 1 AS Level
FROM
dbo.common_LanguageType l
INNER JOIN languages l_default
ON l.DefaultId = l_default.LanguageId
WHERE
l.LanguageId <> l.DefaultId
AND NOT EXISTS (
SELECT *
FROM dbo.common_Text t
WHERE
t.CommentId = @CommentId
AND t.LanguageId = l.LanguageId
)
)
SELECT t.Text
FROM
languages l
INNER JOIN dbo.common_Text t
ON l.RootLanguageId = t.LanguageId
WHERE
l.Code = @LanguageCode
;
尝试跑步
SELECT *
FROM languages;
如果您想了解递归CTE正在做的事情。我已经上传了一个脚本来创建表,插入一些示例数据并运行上述代码 要想.
很性感,不是吗?
不隶属于 dba.stackexchange