Я должен захватить i18n текст от базы данных. Язык по умолчанию является английским, он имеет текст для всего. Но неанглийские языки не обязательно имеют все желаемые переводы. Если бы неанглийский перевод для определенного объекта/ключа не доступен в DB, то я хотел бы иметь его для возврата английского текста вместо этого. Так, английский язык является языком нейтрализации здесь.
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-запросе?
Рассматриваемым DB является 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'