【问题标题】:Conditional selection of a single record from multiple similar records in sqlite3 database从 sqlite3 数据库中的多个相似记录中条件选择单个记录
【发布时间】:2012-06-29 00:21:50
【问题描述】:

我正在开发使用 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. 每个代码值我应该至少有一个记录。

  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 记录只有一个条目,所以应该有这些记录。

我在网上搜索了很多关于如何在类似行上操作这些条件的信息,但我无法得到答案。有人可以帮助我查询预期结果吗?

提前致谢。

【问题讨论】:

    标签: android sqlite


    【解决方案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)
    

    警告:我没有测试这些查询的正确性或性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-02
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      相关资源
      最近更新 更多