Cómo obtener el texto de idioma por defecto
-
16-10-2019 - |
Pregunta
Tengo tablas:
y lo que los datos en la tabla de idioma:
y lo que los datos en la tabla Texto:
Tengo que volver texto para requerida idioma si existe y el texto para por defecto idioma si lo hace no existe . ¿Es posible hacer eso en un query (sin while
, por favor)?
Código:
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
Gracias.
AÑADIDO:
Si el código solicita un texto en 'ua' (Ucrania) y esto no es cualquier texto para esta lengua, por lo que se va a buscar el texto de ruso. si se encuentra - está bien, si no lo hace va a buscar un texto de Inglés. Lista de idiomas puede variar.
Solución
El uso de un CTE recursiva, esta consulta crea una tabla de todas las lenguas de ese punto en alguna parte de su cadena de valor predeterminado a un lenguaje que tiene el comentario requerida. Se muestra cada idioma junto a su primer defecto que tiene el comentario requerida. Se filtra entonces esta tabla para darle el primer texto disponible para el idioma seleccionado.
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
;
Trate sólo corriendo
SELECT *
FROM languages;
si quieres tener una idea de lo que el CTE recursiva está haciendo. He subido un script para crear las tablas, insertar algunos datos de la muestra, y ejecutar el código anterior a lo esencial .
bastante atractivo, no?