Sql-Server-2008

如何獲取預設語言的文本

  • September 27, 2011

我有這樣的表: 在此處輸入圖像描述

以及語言表中的數據:

在此處輸入圖像描述

等文本表中的數據: 在此處輸入圖像描述

如果請求的語言存在,我必須返回文本,如果**不存在,我必須返回預設語言的文本。是否可以在一個查詢中做到這一點(不,請)?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;

如果您想了解遞歸 C​​TE 正在做什麼。我已經上傳了一個腳本來創建表格,插入一些範例數據,然後執行上面的程式碼gist

很性感,不是嗎?

引用自:https://dba.stackexchange.com/questions/4776