【问题标题】:How to find value which includes semicolon (;) sign in SQLite?如何在 SQLite 中查找包含分号 (;) 符号的值?
【发布时间】:2013-08-28 11:25:50
【问题描述】:

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

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

【问题讨论】:

  • 你能粘贴你用来执行查询的代码吗!

标签: android sql sqlite match


【解决方案1】:

以下 SQL 有效:

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

SQL Fiddle

虽然您可能希望采取措施避免 SQL 注入

【讨论】:

  • LIKE 在我的情况下非常慢。如何在 MATCH 中使用它?
  • FTS 忽略标点符号。您必须编写自己的标记器,但这在 Android 上是不可能的。
  • 好的!这就是我要的!现在我知道我无法通过分号找到单词。
  • 虽然正确的标准化,如 GarethD 所示,几乎肯定会更好地解决您的问题。
【解决方案2】:

根据SQLite docs

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

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

例如代替

T

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;

Examples on SQL Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2019-11-25
    相关资源
    最近更新 更多