12

データベースから i18n テキストを取得する必要があります。デフォルトの言語は英語で、すべてのテキストがあります。しかし、英語以外の言語に必要な翻訳がすべて含まれているとは限りません。特定のエンティティ/キーの英語以外の翻訳が DB で利用できない場合は、代わりに英語のテキストを返すようにしたいと考えています。したがって、ここでは英語が代替言語です。

i18n テキスト テーブルは次のようになります (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)
)

データは次のようになります。

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

基本的に、以下の疑似 SQL クエリを実行したいと思います。

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

(実際には、'nl'値はパラメータ化されます)

そのため、次が返されます。

+-----+ ---------------------------+
| | キー | 値 |
+-----+ ---------------------------+
| | ふー | foo in Nederlands (オランダ語) |
| | バー | バー | 英語で
+-----+ ---------------------------+

単一の SQL クエリでこれを達成するにはどうすればよいですか?

問題の DB は PostgreSQL ですが、RDMBS に依存しない方法が適しています。

4

1 に答える 1

21

このようなことを試してください:

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'
于 2010-07-13T15:30:55.073 に答える