Comment obtenir un texte pour la langue par défaut
-
16-10-2019 - |
Question
J'ai donc tableaux:
et ainsi données à table Langue:
et ainsi données à la table de texte:
Je dois revenir texte pour demandé langue si existe et du texte pour default langue si elle n'a pas existe . Est-il possible de le faire dans un requête (pas while
, s'il vous plaît)?
Code:
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
Merci.
AJOUTÉE:
Si le code demande un texte dans « ua » (Ukraine), ce qui est sans aucun texte pour cette langue, il va chercher du texte pour le russe. si trouvé - ok, si ne pas, il cherchera un texte pour l'anglais. Liste des langues peut varier.
La solution
L'utilisation d'un CTE récursive, cette requête crée une table de toutes les langues que quelque part point dans leur chaîne par défaut à une langue qui a le commentaire requis. Il montre chaque langue à côté de son premier défaut qui a le commentaire requis. Il filtre alors ce tableau pour vous donner le premier texte disponible pour la langue sélectionnée.
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
;
on peut lancer
SELECT *
FROM languages;
si vous voulez avoir une idée de ce que le CTE récursive fait. Je l'ai téléchargé un script pour créer les tables, insérer des données d'échantillon, et exécutez le code ci-dessus à fond .
sexy Jolie, non?