我必须从数据库中获取i18n文本。默认语言是英语,它包含 所有内容的 文本。但是非英语语言不一定具有所有所需的翻译。如果数据库中没有某个实体/键的非英文翻译,那么我想让它返回英文文本。因此,英语是此处的 后备 语言。
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'值将被参数化)
'nl'
这样它就返回以下内容:
+ ----- + --------------------------- + | 关键 值| + ----- + --------------------------- + | foo | 荷兰(荷兰)的foo | | 酒吧 英文酒吧| + ----- + --------------------------- +
如何在单个SQL查询中实现此目标?
有问题的数据库是PostgreSQL,但与RDMBS无关的方法会很好。
尝试这样的事情:
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'