2010-07-13 8 views
11

Ich muss i18n Text aus einer Datenbank abrufen. Die Standardsprache ist Englisch, es hat Text für alles. Aber die nicht-englischen Sprachen haben nicht unbedingt alle gewünschten Übersetzungen. Wenn eine nicht englische Übersetzung für eine bestimmte Entität/einen bestimmten Schlüssel nicht in der DB verfügbar ist, möchte ich, dass stattdessen der englische Text zurückgegeben wird. Also, Englisch ist die Fallback Sprache hier.Abrufen von i18n-Daten mit Fallback-Sprache

aussehen Die i18n Texttabelle wie so (PostgreSQL Dialekt):

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

Die Daten dieser wie folgt aussehen:

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

Ich mag würde im Grunde die folgenden Pseudo-SQL-Abfrage tun:

(tatsächlich ist der 'nl' Wert zu parametrieren)

Damit es gibt die folgenden:

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

Wie kann ich dies in einer einzigen SQL-Abfrage erreichen?

Die DB in Frage ist PostgreSQL, aber eine RDMBS-agnostische Art wäre nett.

Antwort

20

versuchen, etwas wie folgt aus:

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

Arbeiten auch in Oracle. Vielen Dank! –