我有这样一个国家的多语言表:
--------------------------------------------------------------------
country | lang | name
--------------------------------------------------------------------
US | en-US | United States
--------------------------------------------------------------------
US | fr | États-Unis
--------------------------------------------------------------------
US | ar | الولايات المتحدة
--------------------------------------------------------------------
US | de |
--------------------------------------------------------------------
我想为lang'de'选择国家'US'字段“name”但是如果是 name字段为空回退到'en-US'语言。
这样的查询也应该是正确的:
select name from countries where country='US' and name<>"" and lang in ('de', 'en-US')
我真的需要优化查询。
答案 0 :(得分:1)
以下是获得答案的方法:
select name
from countries
where country = 'US' and name<>"" and lang in ('de', 'en-US')
order by lang = 'de' desc
limit 1;
如果您在country, lang, name
上有索引,那么它应该会有效。
编辑:
使用相同的索引可能会更好:
select coalesce((select name
from countries
where country = 'US' and name <> "" and lang = 'de'
),
(select name
from countries
where country = 'US' and name <> "" and lang = 'en-US'
)
) as name
编辑II:
与第一种类似的标准SQL方法是:
select (case when sum(case when lang = 'de' then 1 else 0 end) > 0
then max(case when lang = 'de' then name end)
else max(name)
end)
from countries
where country = 'US' and name <> "" and lang in ('de', 'en-US');
任何数据库中两行的聚合应该非常快。但是,the coalesce()
方法基本上应该只是两个索引查找。