如果字段为空,则简单Mysql选择另一行

时间:2014-01-26 21:04:41

标签: mysql

我有这样一个国家的多语言表:

--------------------------------------------------------------------
 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')

我真的需要优化查询。

1 个答案:

答案 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()方法基本上应该只是两个索引查找。