Bal*_*usC 11 sql postgresql fallback internationalization
我必须从数据库中获取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)
)
Run Code Online (Sandbox Code Playgroud)
数据如下所示:
INSERT INTO translation
(language_code, key, value)
VALUES
('en', 'foo', 'foo in English'),
('nl', 'foo', 'foo in Nederlands (Dutch)'),
('en', 'bar', 'bar in English')
Run Code Online (Sandbox Code Playgroud)
我想基本上做下面的伪SQL查询:
SELECT key, value
FROM translation
WHERE (language_code = 'nl' OR IF value IS NULL THEN language_code = 'en')
Run Code Online (Sandbox Code Playgroud)
(实际上,该'nl'
值是参数化的)
这样它返回以下内容:
+-----+---------------------------+ | key | value | +-----+---------------------------+ | foo | foo in Nederlands (Dutch) | | bar | bar in English | +-----+---------------------------+
如何在单个SQL查询中实现此目的?
有问题的DB是PostgreSQL,但RDMBS无关的方式会很好.
KM.*_*KM. 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'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1809 次 |
最近记录: |