【问题标题】:Fallback in a multilingual database design多语言数据库设计中的回退
【发布时间】:2022-01-06 13:28:47
【问题描述】:

我正在设计一个关于产品的多语言数据库——如何原创;)

这是简化的设计:

如果我为'de'选择数据,它是否为空(NULL):

select 
    p.id,
    p.price,
    pi.name,
    pi.description
from public.products p
inner join public.locales loc
on loc.lang = 'de'
left join public.products_i18n pi
on p.id = pi.id and pi.lang = loc.id

当所需的语言环境不存在时,我想使用英语:

select 
    p.id,
    p.price,
    coalesce(pi.name, pi_def.name),
    coalesce(pi.description, pi_def.description)
from public.products p
inner join public.locales loc
on loc.lang = 'de'
left join public.products_i18n pi
on p.id = pi.id and pi.lang = loc.id
left join public.products_i18n pi_def
on p.id = pi_def.id and pi_def.lang = '1' -- fallback on english

但是,我收到两行:1 行包含正确的后备数据(描述应为空),1 行为空。

是 pgAdmin 的显示问题还是我的查询错误?

那里有可用的 SQL 小提琴: http://sqlfiddle.com/#!17/485be/1

【问题讨论】:

  • 我在您的结果中只看到一行?请添加架构定义、示例数据和预期结果 - 请不要使用图像。 SQL Fiddle 会很棒!
  • 有一个空白行。我不知道 SQL fiddle,我会在一分钟内回复您!
  • @NevilleKuyt 请查看我更新的问题:) 它似乎只返回 1 行,但是 pgAdmin 的显示是.. 那个空行很奇怪。也许这只是一个显示问题。
  • 您的第二个查询运行良好您的问题是什么?
  • 我的问题取决于它是否正常 pgAdmin 向我显示第二行(但为空),与第一个查询相比。是来自 pgAdmin 的无意义显示,还是由于我的查询生成了第二个空行

标签: sql database postgresql join window-functions


【解决方案1】:

无需加入2份public.products_i18n
过滤public.locales,使其仅返回'de''en',如果'de' 不存在,则使用FIRST_VALUE() 窗口函数获取'de''en' 的详细信息:

select distinct p.id, p.price,
       first_value(pi.name) over (partition by p.id order by loc.lang = 'de' desc) "name",
       first_value(pi.description) over (partition by p.id order by loc.lang = 'de' desc) description
from public.products p
inner join public.products_i18n pi on p.id = pi.id 
inner join public.locales loc on loc.lang in ('de', 'en') and pi.lang = loc.id;

请参阅demo

【讨论】:

  • 这应该返回Beer,但返回Bier。但是我不知道first_value() 函数,所以谢谢你,我会阅读更多相关内容
  • @Binajmen 正确,我已经编辑过了。
  • order by loc.lang = 'de' desc应该理解为“在降序排序之前优先考虑'de'”?
  • @Binajmen 完全正确。
  • 我在pgAdmin中检查了查询分析。明显比我的好;)
猜你喜欢
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多