2014-01-26 57 views
0

我對這個國家這樣的多國語言表:簡單的Mysql選擇另一行如果字段爲空

-------------------------------------------------------------------- 
country | lang | name 
-------------------------------------------------------------------- 
US  | en-US | United States 
-------------------------------------------------------------------- 
US  | fr | États-Unis 
-------------------------------------------------------------------- 
US  | ar | الولايات المتحدة 
-------------------------------------------------------------------- 
US  | de | 
-------------------------------------------------------------------- 

我想選擇字段「名稱」爲國美'爲郎'de',但是如果 名稱字段爲空回退到語言'en-US'。

所以將這樣的查詢應該是正確的:

select name from countries where country='US' and name<>"" and lang in ('de', 'en-US') 

我真的需要優化的查詢。

回答

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()方法本質上應該只是兩個索引查找。

+0

感謝戈登爲您的答案,如果我正在尋找SQL可移植性不僅是mysql,第一個查詢是什麼,第二個查詢是否合併sql protable,我知道我的問題只針對mysql,但因爲我學習將有興趣瞭解可移植性。我知道mssql它使用「頂部」而不是「限制」。 – daliaessam

+0

@daliaessam。 。 。第二個查詢是標準SQL,應該可以在大多數數據庫中使用。第一個使用'limit';不同的數據庫有不同的方式來實現這個功能。 –

相關問題