我必须从数据库中获取 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 无关的方式会很好。