Sql-Server-2008
如何獲取預設語言的文本
我有這樣的表:
以及語言表中的數據:
等文本表中的數據:
如果請求的語言存在,我必須返回文本,如果**不存在,我必須返回預設語言的文本。是否可以在一個查詢中做到這一點(不,請)?
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 正在做什麼。我已經上傳了一個腳本來創建表格,插入一些範例數據,然後執行上面的程式碼gist。
很性感,不是嗎?