2010-07-13 5 views
11

Je dois saisir du texte i18n à partir d'une base de données. La langue par défaut est l'anglais, il a le texte pour tout. Mais les langues non-anglais n'ont pas nécessairement toutes les traductions désirées. Si une traduction non-anglaise pour une certaine entité/clé n'est pas disponible dans la base de données, alors je voudrais l'avoir pour renvoyer le texte anglais à la place. Donc, l'anglais est le langue de secours ici.Récupération de données i18n avec un langage de repli

Le tableau texte i18n ressemble donc (dialecte 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) 
) 

Les données ressemblent à ceci:

INSERT INTO translation 
    (language_code, key, value) 
VALUES 
    ('en', 'foo', 'foo in English'), 
    ('nl', 'foo', 'foo in Nederlands (Dutch)'), 
    ('en', 'bar', 'bar in English') 

Je voudrais essentiellement faire le ci-dessous pseudo requête SQL:

SELECT key, value 
FROM translation 
WHERE (language_code = 'nl' OR IF value IS NULL THEN language_code = 'en') 

(en fait, la valeur 'nl' doit être paramétrée)

Alors qu'il renvoie les éléments suivants:

 
+-----+---------------------------+ 
| key | value      | 
+-----+---------------------------+ 
| foo | foo in Nederlands (Dutch) | 
| bar | bar in English   | 
+-----+---------------------------+ 

Comment puis-je obtenir cela dans une seule requête SQL?

La base de données en question est PostgreSQL, mais une méthode agnostique RDMBS serait bien.

Répondre

20

essayer quelque chose comme ceci:

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' 
+0

Works dans oracle aussi. Merci! –

Questions connexes