2010-07-13 42 views
11

我必須從數據庫中獲取i18n文本。默認語言是英文,它的文字爲,全部爲。但非英語語言不一定具有所有期望的翻譯。如果某個實體/密鑰的非英文翻譯在數據庫中不可用,那麼我想讓它返回英文文本。所以,英文是fallback這裏的語言。使用備用語言檢索i18n數據

的國際化文本表看起來像這樣(PostgreSQL的方言):

CREATE TABLE translation (
    id SERIAL PRIMARY KEY, 
    language_code CHAR(2) NOT NULL, 
    key VARCHAR(20) NOT NULL, 
    value TEXT NOT NULL, 
    CONSTRAINT translation_unique UNIQUE (language_code, key) 
) 

的數據是這樣的:

INSERT INTO translation 
    (language_code, key, value) 
VALUES 
    ('en', 'foo', 'foo in English'), 
    ('nl', 'foo', 'foo in Nederlands (Dutch)'), 
    ('en', 'bar', 'bar in English') 

我想基本上做下面的僞SQL查詢:

SELECT key, value 
FROM translation 
WHERE (language_code = 'nl' OR IF value IS NULL THEN language_code = 'en') 

(實際上,'nl'值將被參數化)

因此,它返回下列信息:

 
+-----+---------------------------+ 
| key | value      | 
+-----+---------------------------+ 
| foo | foo in Nederlands (Dutch) | 
| bar | bar in English   | 
+-----+---------------------------+ 

我怎樣才能在一個SQL查詢實現這一目標?

有問題的數據庫是PostgreSQL,但RDMBS不可知論的方式會很好。

回答

20

嘗試這樣的事:

SELECT 
    e.key,COALESCE(o.value,e.value) 
    FROM Translation    e 
     LEFT OUTER JOIN Translation o ON e.key=o.key and o.language_code='nl' 
    WHERE e.language_code='en' 
+0

作品中預言過。謝謝! – 2012-08-27 08:39:21

相關問題