2010-07-13 10 views
11

Tôi phải lấy văn bản i18n từ cơ sở dữ liệu. Ngôn ngữ mặc định là tiếng Anh, nó có văn bản cho mọi thứ. Nhưng các ngôn ngữ không phải tiếng Anh không nhất thiết phải có tất cả các bản dịch mong muốn. Nếu bản dịch không phải tiếng Anh cho một tổ chức/khóa nhất định không có trong DB, thì tôi muốn có nó để trả lại văn bản tiếng Anh thay thế. Vì vậy, tiếng Anh là ngôn ngữ dự phòng tại đây.Lấy dữ liệu i18n bằng ngôn ngữ dự phòng

Bảng văn bản i18n trông giống như vậy (PostgreSQL phương ngữ):

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

Các dữ liệu giống như thế này:

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

Tôi muốn về cơ bản làm dưới đây truy vấn SQL giả:

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

(thực tế, giá trị 'nl' cần được tham số hóa)

Vì vậy mà nó trả về như sau:

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

Làm thế nào tôi có thể đạt được điều này trong một truy vấn SQL đơn?

DB được đề cập là PostgreSQL, nhưng cách RDnS-thuyết bất khả tri sẽ tốt đẹp.

Trả lời

20

thử một cái gì đó như thế này:

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

trình trong oracle quá. Cảm ơn! –