2012-06-28 66 views
1

我正在使用Sqlite3數據庫進行存儲的android應用程序。從sqlite3數據庫中的多個相似記錄的條件選擇

最近我遇到了一個問題,我需要根據我在特定列上的條件從多個相似行中選擇一行。

只是更加具體......

來源的數據:在數據庫

_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. 我應該有每個代碼值的至少一個記錄。

  2. 我必須根據我想要的語言進行搜索。假設如果我把西班牙語作爲語言,我應該得到西班牙語的所有記錄。

  3. 如果任何代碼條目沒有給定的語言,那麼我應該得到該代碼的英文輸入。

  4. 如果任何代碼條目只有一種語言的記錄,那麼我應該得到該記錄,而不管我給出的語言。

我從上表中預期的結果:

如果我給語言爲西班牙語: -

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條記錄只有一個條目,所以這些記錄應該來。

我在網上搜索了很多關於如何在類似的行上操縱這些條件的問題,但我無法得到答案。有人可以幫助我查詢預期結果。

在此先感謝。

回答

0

如果你需要在一個怪物查詢中完成它,這裏有一種基於外連接幾個子查詢的方法。 假設:(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是提供這些行子查詢:4說,對於一個特定代碼的任何單記錄應該出現在結果

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

規則。讓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) 

注意:我還沒有測試這些查詢的正確性或性能。

相關問題