2010-07-13 12 views
11

Tengo que tomar el texto i18n de una base de datos. El idioma predeterminado es inglés, tiene texto para todo. Pero los idiomas que no están en inglés no necesariamente tienen todas las traducciones deseadas. Si una traducción no inglesa de una determinada entidad/clave no está disponible en la base de datos, entonces me gustaría tenerla para devolver el texto en inglés. Entonces, el inglés es el alternativo idioma aquí.Recuperación de datos i18n con el lenguaje alternativo

La tabla de texto i18n parezca tan (PostgreSQL dialecto):

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

Los datos se ven así:

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

me gustaría hacer básicamente el siguiente seudo consulta SQL:

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

(en realidad, el valor 'nl' es ser parametrizado)

para que devuelva el siguiente:

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

¿Cómo puedo lograr esto en una sola consulta SQL?

El DB en cuestión es PostgreSQL, pero una forma independiente de RDMBS sería agradable.

Respuesta

20

intentar algo como esto:

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

Obras en Oracle también. ¡Gracias! –