Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在SQLite中查找包含分号(;)符号的值?_Android_Sql_Sqlite_Match - Fatal编程技术网

Android 如何在SQLite中查找包含分号(;)符号的值?

Android 如何在SQLite中查找包含分号(;)符号的值?,android,sql,sqlite,match,Android,Sql,Sqlite,Match,我正在用分号(;)符号搜索值。因此,我: 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,

我正在用分号(
)符号搜索值。因此,我:

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

以下SQL工作:

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


尽管您可能希望采取措施避免SQL注入,但以下SQL仍然有效:

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

尽管根据

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

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

e、 g而不是

T

TID     Name        Value
1       Test        apple; orange; banana
2       Test2       pineapple; watermelon
TID     Name
1       apple
1       orange
1       banana
2       pineapple
2       watermelon
你有两张桌子

T-存储关键信息

TID     Name
1       Test
2       Test2
T值-通过返回到T的链接存储值

TID     Name        Value
1       Test        apple; orange; banana
2       Test2       pineapple; watermelon
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中使用的单个字符串:

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;

根据

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

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

e、 g而不是

T

TID     Name        Value
1       Test        apple; orange; banana
2       Test2       pineapple; watermelon
TID     Name
1       apple
1       orange
1       banana
2       pineapple
2       watermelon
你有两张桌子

T-存储关键信息

TID     Name
1       Test
2       Test2
T值-通过返回到T的链接存储值

TID     Name        Value
1       Test        apple; orange; banana
2       Test2       pineapple; watermelon
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中使用的单个字符串:

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;

能否粘贴用于执行查询的代码!你能粘贴你用来执行查询的代码吗!在我的情况下,LIKE很慢。如何将其用于匹配?FTS忽略标点符号。您必须编写自己的标记器,但这在Android中是不可能的。好吧!这就是我想要的!现在我知道我无法通过分号找到单词。虽然正确的规范化,如GarethD所示,几乎肯定会更好地解决您的问题。在我的情况下,LIKE是非常缓慢的。如何将其用于匹配?FTS忽略标点符号。您必须编写自己的标记器,但这在Android中是不可能的。好吧!这就是我想要的!现在我知道我无法通过分号找到单词。尽管正确的规范化,如GarethD所示,几乎肯定会更好地解决您的问题。