短篇小说。我正在开发一个需要与SQLite数据库通信的项目。我有几个问题:
有一个带有 nodeId 和 nodeName 列的FTS表。我需要选择nodeNames包含某些文本模式的所有nodeIds。例如,所有节点名称中都包含“Donald”。在thread中讨论了类似的东西。关键是我不能使用 CONTAINS 关键字。相反,我使用 MATCH 。这就是问题本身:这个“唐纳德”字符串应该如何“框架化”?使用'*'或'%'字符?这是我的疑问:
SELECT * FROM nodeFtsTable WHERE nodeName MATCH "Donald"
在 SELECT 语句中编写多个比较是否可以?我的意思是这样的:
SELECT * FROM distanceTable WHERE pointId = 1 OR pointId = 4 OR pointId = 203 AND distance<200
我希望听起来不会让人感到困惑。提前谢谢!
答案 0 :(得分:2)
编辑:抱歉,我错过了您使用FTS4的事实。看起来你可以这样做:
SELECT * FROM nodeFtsTable WHERE nodeName MATCH 'Donald'
Here is relevant documentation.
不需要使用通配符来匹配Donald
为离散词的所有条目(例如,上述内容将匹配Donald Duck
)。如果您想将Donald
作为单词的一部分(例如Donalds
),那么您需要在适当的位置使用*
:
SELECT * FROM nodeFtsTable WHERE nodeName MATCH 'Donald*'
如果您的查询不起作用,可能是因为您使用了双引号。
MATCH运算符是match()的特殊语法 应用程序定义的函数。默认的match()函数 实现引发异常,并没有真正有用 任何东西。但扩展可以覆盖match()函数 有用的逻辑。
FTS4是一个提供match()
功能的扩展程序。
是的,可以在第二个查询中使用多个条件。当您有一组复杂的条件时,了解条件的评估顺序非常重要。 AND
始终在OR
之前进行评估(它们分别与数学乘法和加法相似)。在实践中,我认为在使用AND
和OR
的组合时,最好使用括号来清晰:
--This is the same as with no parentheses, but is clearer:
SELECT * FROM distanceTable WHERE
pointId = 1 OR
pointId = 4 OR
(pointId = 203 AND distance<200)
--This is something completely different:
SELECT * FROM distanceTable WHERE
(pointId = 1 OR pointId = 4 OR pointId = 203) AND
distance<200