SQLite 和 Room Persistence Library:如何结合 IN 条件和 LIKE?

SQLite and Room Persistence Library: how to combine IN condition and LIKE?

我在这个问题上遇到了问题 "Googling",但希望这对专家(甚至中级)来说不会太棘手。

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

AndroidSQLite 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' );

并且会 return:['Paris, France'、'Berlin, Germany']

但是,我希望能够仅按国家/地区进行搜索。例如,给定 ['France'、'Germany'] 的搜索列表,不幸的是我没有得到任何结果。

我理解以下 SQL 可以解决问题:

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

但是,因为我不知道searchList中会有多少元素,所以我不得不使用原来的格式:

SELECT country FROM table WHERE country IN (:searchList)

有什么方法可以使上述搜索在国家列中搜索子字符串吗?

非常感谢您的帮助,

由于 Android 的 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)