2013-08-28 50 views
0

我正在用分號(;)符號搜索值。所以我有:如何在SQLite中查找包含分號(;)的值?

SELECT * FROM table WHERE value MATCH '; "+lookingFor+"*' 

它給SQLite的邏輯錯誤。如何解釋程序「;」是不是把代碼分解成塊?我做錯了什麼?

PS。值列例如:

apple; orange; banana 
pineapple; watermelon 

這是查詢:

query = "SELECT id AS _id, 
entry_id , 
re_value, 
ke_value, 
g_value 
FROM search_eng_fts 
WHERE g_value MATCH '" 
+ lookingFor+ "* OR 
; "+lookingFor+"*' 
ORDER BY length(g_value) 
LIMIT 100"; 
+0

你可以粘貼你用來執行查詢的代碼! –

+0

增加了實際查詢 –

回答

2

下面的SQL工作:

SELECT * FROM list WHERE value like '%; banana%' 

SQL Fiddle

雖然你可能要採取措施來避免SQL注入

+0

LIKE在我的情況下非常緩慢。如何將這與MATCH一起使用? –

+0

FTS忽略標點字符。你將不得不編寫自己的標記器,但這對於Android來說是不可能的。 –

+0

好的!這就是我要的!現在我知道我無法用分號找到單詞。 –

2

根據SQLite docs

MATCH運算符是match()應用程序定義函數的特殊語法。默認的match()函數實現引發了一個異常,對任何事情都沒有什麼用處。但擴展可以用更有用的邏輯覆蓋match()函數。

您是否考慮過不將值存儲爲分隔字符串,而是根據預期使用關係數據庫,因此每個值在新表中都有自己的行。

e.g而不是

牛逼

TID  Name  Value 
1  Test  apple; orange; banana 
2  Test2  pineapple; watermelon 

你有2個表,

牛逼 - 要存儲的關鍵信息

TID  Name 
1  Test 
2  Test2 

TValues - 要回一個鏈接存儲的值牛逼

TID  Name 
1  apple 
1  orange 
1  banana 
2  pineapple 
2  watermelon 

這樣你的查詢可以簡化爲:

SELECT T.TID, T.Name, TValues.Name 
FROM T 
     INNER JOIN TValues 
      ON T.TID = TValues.TID 
WHERE TValues.Name = 'apple'; 

如果您需要返回到您可以使用GROUP_CONCAT單串SQLite中:

SELECT T.TID, T.Name, GROUP_CONCAT(TValues.Name, '; ') AS Value 
FROM T 
     INNER JOIN TValues 
      ON T.TID = TValues.TID 
GROUP BY T.TID, T.Name; 

Examples on SQL Fiddle

+0

反正謝謝!但我的意思是另一件事... –