我正在設計一個關于產品的多語言資料庫——多么原始;)
這是簡化的設計:

如果我為“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
uj5u.com熱心網友回復:
無需加入 2 個副本public.products_i18n。
過濾器public.locales,使其僅回傳'de',并'en'和使用FIRST_VALUE()窗函式來獲取詳細資訊'de'或'en'如果'de'不存在:
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;
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/407037.html
標籤:
下一篇:加入其他表以回傳自定義結果
