Мне нужно взять 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 способ.