0

我正在搜索带有分号 ( ;) 符号的值。所以我有:

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";
4

2 回答 2

2

以下 SQL 有效:

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

SQL小提琴

尽管您可能希望采取措施避免 SQL 注入

于 2013-08-28T11:39:31.560 回答
2

根据SQLite 文档

MATCH 运算符是 match() 应用程序定义函数的特殊语法。默认的 match() 函数实现会引发异常,并且对任何事情都没有真正的用处。但是扩展可以用更有用的逻辑覆盖 match() 函数。

您是否考虑过不将值存储为分隔字符串,而是按预期使用关系数据库,因此每个值在新表中都有自己的行。

例如,而不是

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

你有2张桌子,

T - 存储关键信息

TID     Name
1       Test
2       Test2

TValues - 存储带有返回T的链接的值

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

如果需要返回单个字符串,可以在 SQLite中使用GROUP_CONCAT :

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;

SQL Fiddle 上的示例

于 2013-08-28T12:12:15.827 回答