2017-08-22 95 views
2

我在使用谷歌搜索這個軟件時遇到了麻煩,但希望對於專家(甚至是中間人)來說不是太棘手。SQLite和房間持久性庫:如何結合IN條件和LIKE?

有沒有辦法在未知數量的多個OR條件中搜索子字符串?

爲Android SQLite的客房持久DAO原來的查詢是:

SELECT country FROM table WHERE country IN (:searchList) 

其中,由於[ '法國巴黎',「柏林,德國]的searchList將轉換爲SQL:

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

而且將返回:「巴黎,法國」,「德國柏林」]

不過,我想能夠僅由國家進行搜索。例如,給定一個['法國','德國']的搜索列表,我不幸得不到結果。

我瞭解以下SQL會做的伎倆:

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

但是,因爲我不知道有多少元素將在searchList,我必須使用原來的格式:

SELECT country FROM table WHERE country IN (:searchList) 

有沒有什麼辦法可以在國家/地區列中對子字符串進行上述搜索?

非常感謝您的幫助,

+0

由於機器人源碼(版本)不支持正則表達式搜索查詢時,可能要拆分的列表(:searchList)改爲單個單詞?示例︰https://stackoverflow.com/questions/41678776/substring-for-sqlite-android –

+0

我希望避免splitting searchList,因爲那麼我將不得不執行多個調用數據庫 - searchList的每個元素之一。 – danwag

回答

1

由於機器人會SQLite是不是正則表達式出貨則需要在搜索之前分裂名單。

SQLite IN-Operator對列表進行排序,並使用二進制搜索,這比使用單個查詢更快。

性能或VS在比較速度(可惜不是批量查詢)

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) 
+0

謝謝你的回答。這是一個恥辱雖然:) 我想我會做的是爲每個條目添加一個國家行,所以一個UID將連接到「柏林,德國」和「德國」。 – danwag

+0

是的,我知道,但這是房間..我使用它的非常大的項目和它的穩定到目前爲止,但這並不意味着它的最後現在;-)有一些支持正則表達式的Sqlite端口。 –

+0

如果您獲得所有結果或至少成羣結果並在之後使用選擇/過濾器,則可能需要對速度進行基準測試。 –