条件SQL查询列映射

时间:2015-08-31 09:41:03

标签: sql sql-server database join

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

这样的查询怎么样?是否有更好的方法来分离表格,以便查询和处理数据更简单?

3 个答案:

答案 0 :(得分: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 = ? 

答案 1 :(得分:2)

你的桌子设计似乎很好。要仅在数据存在时获取数据,请使用外部联接。然后使用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 :(得分:1)

数据库架构没问题。您使用类别默认值和带有语言表的已翻译类别。 所以你有1-> lang n-> cat transaltions to - > n cats。

你应该查询数据库以便:

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

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