【问题标题】:Conditional SQL query column mapping条件 SQL 查询列映射
【发布时间】:2015-08-31 09:41:02
【问题描述】:

我有两个数据库表 - CategoriesLocalizedCategoriesCategories 表具有默认语言的所有类别的 NameDescription 列。 LocalizedCategories 表也有这些列,其中包含这些列到其他语言的翻译(每种内容语言都有其 id,因此表的主键由 ContentLanguageIdCategoryId 组成)。我现在想执行一个 SELECT 查询来获取所有类别,以便结果中的文本数据被本地化,以防给定类别和内容语言的翻译可用。如果翻译不可用,或者内容语言是默认语言,我想回退到Categories 表中的默认值。

这样的查询会是什么样子?有没有更好的方法来分隔表,以便更简单地查询和处理数据?

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • 主要是 Microsoft SQL Server
  • 在本地化时如何确定选择哪种语言?

标签: sql sql-server database join


【解决方案1】:

你的桌子设计看起来不错。要仅在数据存在时获取数据,可以通过 外部联接 来完成。然后使用 COALESCE 获取一个值或另一个值。

select 
  coalesce(lc.name, c.name),
  coalesce(lc.description, c.description)
from categories c
left outer join localizedcategories lc 
  on lc.categoryid = c.categoryid and lc.contentlanguageid = 'EN';

【讨论】:

    【解决方案2】:

    简单,只需要左连接:

    select Description = coalesce(lc.Description, c.Description )
         , Name        = coalesce(lc.Name, c.Name)
         , Lang        = coalesce(lc.Lang, DefaultContentLanguageId )
    from Categories c 
    left join LocalizedCategories lc on c.CategoryId=lc.CategoryId and lc.ContentLanguageId = ? 
    

    【讨论】:

      【解决方案3】:

      数据库架构没问题。您使用默认类别和带有语言表的已翻译类别。 所以你有 1->lang n->cat 到 ->n 个猫的转换。

      你的 sql 应该查询 db 以便:

      SELECT * FROM Categories INNER JOIN LocalizedCategories USING (Category_id) WHERE ContentLanguageId=?
      

      如果给定语言没有对 Category_id 的翻译,这将返回 0 行。 在您的服务器语言中,您可以完成这些并实现其背后的逻辑,如果给定的查询没有返回任何数据,则查询默认表并用它们填充显示的数据。

      【讨论】:

        猜你喜欢
        • 2010-10-08
        • 2015-06-01
        • 2017-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-11
        • 1970-01-01
        • 2020-07-06
        相关资源
        最近更新 更多