2010-07-13 41 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

相关问题