我必须从数据库中获取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'
值将被参数化)
这样它返回以下内容:
+-----+---------------------------+ | key | value | +-----+---------------------------+ | foo | foo in Nederlands (Dutch) | | bar | bar in English | +-----+---------------------------+
如何在单个SQL查询中实现此目的?
有问题的数据库是PostgreSQL,但RDMBS无关的方式会很好。
答案 0 :(得分: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'