【问题标题】:SQLite and Room Persistence Library: how to combine IN condition and LIKE?SQLite 和 Room Persistence 库:如何结合 IN 条件和 LIKE?
【发布时间】:2017-08-22 10:51:29
【问题描述】:

我在“谷歌搜索”这个问题时遇到了麻烦,但希望对于专家(甚至中级)来说不会太棘手。

有没有办法在未知数量的多个 OR 条件中搜索子字符串?

Android SQLite Room Persistence DAO 的原始查询是:

SELECT country FROM table WHERE country IN (:searchList)

如果搜索列表 ['Paris, France', 'Berlin, Germany'] 将转换为 SQL:

SELECT country FROM table WHERE country IN ( 'Paris, France', 'Berlin, Germany' );

并且会返回:['Paris, France', 'Berlin, Germany']

但是,我希望能够仅按国家/地区进行搜索。例如,给定一个 ['France', 'Germany'] 的 searchList,我很遗憾没有得到任何结果。

我知道下面的 SQL 可以解决问题:

SELECT country FROM table  WHERE country LIKE '%France%' OR country LIKE '%Germany%';

但是,因为我不知道searchList中有多少元素,所以我必须使用原始格式:

SELECT country FROM table WHERE country IN (:searchList)

有没有什么办法可以在国家列中进行上述搜索?

非常感谢您的帮助,

【问题讨论】:

  • 由于 androids sqlite (version) 不支持搜索查询中的正则表达式,您可能希望将 List (:searchList) 拆分为单个单词?示例:stackoverflow.com/questions/41678776/…
  • 我希望避免拆分 searchList,因为那样我必须对 DB 执行多次调用 - 每个 searchList 元素调用一次。

标签: android sqlite android-sqlite android-room


【解决方案1】:

由于 Androids Sqlite 未附带 Regex,因此您需要在搜索之前拆分列表。

SQLite IN-Operator 对您的列表进行排序并使用二进制搜索,这比在这种情况下使用单个查询要快得多。

Performance OR vs IN 比较速度(可惜不适用于批量查询)

SELECT COUNT(*) FROM t_inner WHERE val IN (1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000);
1 row fetched in 0.0032 (1.2679 seconds)

SELECT COUNT(*) FROM t_inner WHERE val = 1000 OR val = 2000 OR val = 3000 OR val = 4000 OR val = 5000 OR val = 6000 OR val = 7000 OR val = 8000 OR val = 9000;
1 row fetched in 0.0026 (1.7385 seconds)

【讨论】:

  • 感谢您的回答。不过这很可惜 :) 我想我要做的是为每个条目添加一个国家行,因此 UID 将链接到“柏林,德国”和“德国”。
  • 是的,我知道,但这是 Room.. 我将它用于非常大的项目并且到目前为止它很稳定,但这并不意味着它现在是最终的 ;-) 有一些 Sqlite 端口支持正则表达式。
  • 如果您获得所有结果或至少成束并在之后使用选择/过滤器,您可能需要对速度进行基准测试。
  • 好点。我会留意更新,但现在额外的行应该可以解决问题。
  • 速度不是问题,搜索的位置不应该超过 20 个,这只是可变性 - 我不知道我要搜索多少个位置,所以我无法事先创建具有正确数量的 OR 的 SQL。
猜你喜欢
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2020-05-28
  • 2010-12-24
  • 2018-06-19
  • 1970-01-01
相关资源
最近更新 更多