Мне нужно захватить 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-agnostic был бы приятным.