【问题标题】:SQL - Fallback to default language when translate does not existSQL - 当翻译不存在时回退到默认语言
【发布时间】:2017-09-14 17:52:28
【问题描述】:

将不同语言的文本记录在具有以下结构的表 (tbl_i18n) 中:

text_FK | language_FK | value
-----------------------------
    1   |       1     | hello
    1   |       2     | hallo
    2   |       1     | world
    3   |       1     | test

通过简单的连接给出特定语言 (id = 2) 的文本,例如:

SELECT [value] FROM tbl_i18n i
   JOIN tbl_products p ON p.text_id = i.text_FK
   JOIN tbl_languages l ON l.id = i.language_FK AND i.language FK = 2;

结果是:

 value
-------
 hallo

前面提到的 select 语句怎么会改变,所以我们可以获得默认语言,当文本字段的翻译不存在时,它们的后备文本将显示出来,结果将变为:

 value
-------
 hallo
 world
 test

【问题讨论】:

  • 您能否修改问题以便更好地理解?
  • 也检查这个问题,看看它是否有帮助stackoverflow.com/questions/3238651/…
  • @lostmylogin,这里我们有 3 个文本字段和 4 个记录。 3个英语和1个德语。你好字段有德语翻译,但其他人没有。我想获得德语的所有字段,但是当没有德语翻译时,应该返回英语字段。 Tanx 链接;看起来很有希望。

标签: sql sql-server internationalization


【解决方案1】:

LEFT JOIN 语言表两次。第一次为通缉语言,第二次为后备值。如果可用,请使用 COALESCE 选择想要的语言,否则选择备用语言。

SELECT coalesce(l1.[value], l2.[value])
FROM tbl_i18n i
JOIN tbl_products p ON p.text_id = i.text_FK
LEFT JOIN tbl_languages l1 ON l.id = i.language_FK AND i.language_FK = 2
LEFT JOIN tbl_languages l2 ON l.id = i.language_FK AND i.language_FK = 1;

【讨论】:

  • 简明扼要。坦克斯。
  • 是否可以在不需要使用 COALESCE 并且只有一个语言集别名而不是 l1、l2 的情况下实现该方法?可能是通过使用 UNION .. 我需要使用 Linq-to-SQL 为具有选择器参数的不同实体编写通用方法,该方法通过其他表中的本地化文本对表数据进行排序。
【解决方案2】:

我认为用简单的英语你想要每个text_FK 的最高可用language_FK

WITH X AS (
SELECT *
     ,ROW_NUMBER() OVER (PARTITION BY text_FK ORDER BY language_FK DESC)rn
FROM TableName 
)
SELECT *
FROM X
WHERE X.rn = 1

【讨论】:

  • 为了简单起见,我在这里使用了int ids;实际上我们使用uniqueidentifier 作为id;所以我不确定我们是否可以使用ORDER BY
猜你喜欢
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多