【问题标题】:Conditional SQL query column mapping条件 SQL 查询列映射
【发布时间】:2015-08-31 09:41:02
【问题描述】:
我有两个数据库表 - Categories 和 LocalizedCategories。 Categories 表具有默认语言的所有类别的 Name 和 Description 列。 LocalizedCategories 表也有这些列,其中包含这些列到其他语言的翻译(每种内容语言都有其 id,因此表的主键由 ContentLanguageId 和 CategoryId 组成)。我现在想执行一个 SELECT 查询来获取所有类别,以便结果中的文本数据被本地化,以防给定类别和内容语言的翻译可用。如果翻译不可用,或者内容语言是默认语言,我想回退到Categories 表中的默认值。
这样的查询会是什么样子?有没有更好的方法来分隔表,以便更简单地查询和处理数据?
【问题讨论】:
标签:
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 行。
在您的服务器语言中,您可以完成这些并实现其背后的逻辑,如果给定的查询没有返回任何数据,则查询默认表并用它们填充显示的数据。