1

ストレージにSqlite3データベースを使用するAndroidアプリケーションに取り組んでいます。

最近、特定の列の状態に基づいて、複数の類似した行から行を選択する必要があるという問題に遭遇しました。

具体的には...

ソースデータ:

_id | code | language | data

 1  | 1    | English  | aaa

 2  | 1    | French   | bbb

 3  | 1    | Spanish  | ccc

 4  | 1    | Portuguse| ddd

 5  | 2    | English  | eee

 6  | 2    | French   | fff

 7  | 3    | English  | ggg

 8  | 4    | French   | hhh

データベース内の複数のエントリは、同じコード値と異なる言語値を持つことができます。

私の条件は次のとおりです。

  1. 各コード値のレコードが少なくとも1つ必要です。

  2. 希望する言語に基づいて検索する必要があります。スペイン語で言語を指定する場合、スペイン語のすべてのレコードを取得する必要があるとします。

  3. 指定した言語を持たないコードエントリがある場合は、そのコードの英語エントリを取得する必要があります。

  4. コードエントリのいずれかに1つの言語のレコードが1つしかない場合は、指定した言語に関係なく、そのレコードを取得する必要があります。

上記の表からの私の期待される結果:

私がスペイン語として言語を与える場合:-

3  | 1    | Spanish  | ccc

5  | 2    | English  | eee

7  | 3    | English  | ggg

8  | 4    | French   | hhh
  1. 1,2,3,4のコード値が必要です。

  2. コード1のスペイン語の言語で私はスペイン語の記録を持っているので、それは来るはずです。

  3. コード2のスペイン語の場合、スペイン語のレコードがないため、コード2のレコードと英語の言語を選択する必要があります。

  4. コード3および4のレコードにはエントリが1つしかないため、これらのレコードを取得する必要があります。

同様の行でこの種の条件を操作する方法についてWebで多くのことを検索しましたが、答えを得ることができませんでした。誰かが期待される結果のクエリを手伝ってくれませんか。

前もって感謝します。

4

1 に答える 1

0

1 つのモンスター クエリでそれを達成する必要がある場合は、いくつかのサブクエリを外部結合することに基づく 1 つのアプローチを次に示します。 前提:(code, language)は一意のキーです。すべての列はNOT NULLです。


まず、ルール 1 は、各コードが最終結果で表現される必要があることを示しています。all_codesそれぞれの一意のコードを提供するサブクエリにしましょう:

(select code 
   from my_table 
  group by code) all_codes

次に、ルール 2 は、目的の言語を含むすべての行が存在する必要があることを示しています。matchesこれらの行を提供するサブクエリを次のようにします。

(select _id, code, language, data 
   from my_table 
  where language = ?) matches

次に、ルール 3 は、目的の言語がない場合、英語にフォールバックすることを示しています。en_fallbacksこれらの行を提供するサブクエリを次のようにします。

(select _id, code, language, data 
   from my_table 
  where language = 'English') en_fallbacks

ルール 4 は、特定のコードのすべてのシングルトン レコードが結果に存在する必要があることを示しています。singletonsこれらの行を提供するサブクエリを次のようにします。

(select MIN(_id) as _id, code, MIN(language) as language, MIN(data) as data 
   from my_table 
  group by code 
 having (MIN(_id) = MAX(_id))) singletons

code最後に、共有列でそれらを順番に結合し、COALESCE必要な列値を取得するために使用します。

select all_codes.code,
       COALESCE(matches._id, en_fallbacks._id, singletons._id) as _id,
       COALESCE(matches.language, en_fallbacks.language, singletons.language) as language,
       COALESCE(matches.data, en_fallbacks.data, singletons.data) as data
  from (...) all_codes
       left outer join (...) matches on (all_codes.code = matches.code)
       left outer join (...) en_fallbacks on (all_codes.code = en_fallbacks.code)
       left outer join (...) singletons on (all_codes.code = singletons.code)

注意:これらのクエリの正確性やパフォーマンスはテストしていません。

于 2012-06-28T16:21:50.883 に答える