2010-07-13 5 views
11

Devo prendere il testo i18n da un database. La lingua predefinita è l'inglese, ha il testo per tutto. Ma le lingue non inglesi non hanno necessariamente tutte le traduzioni desiderate. Se una traduzione non inglese per una determinata entità/chiave non è disponibile nel DB, mi piacerebbe averlo per restituire il testo inglese invece. Quindi, l'inglese è la lingua di riserva di riserva qui.Recupero dei dati i18n con linguaggio di fallback

La tabella di testo i18n sembrare così (PostgreSQL in dialetto):

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) 
) 

I dati simile a questa:

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

Mi piacerebbe fare fondamentalmente la sottostante query SQL pseudo:

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

(in realtà, il valore 'nl' deve essere parametrizzato)

in modo che restituisca il seguente:

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

Come posso raggiungere questo obiettivo in una singola query SQL?

Il DB in questione è PostgreSQL, ma un modo agnostico RDMBS sarebbe bello.

risposta

20

provare qualcosa di simile:

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

Lavori in Oracle troppo. Grazie! –