SQL FTS和比较语句

时间:2012-10-24 07:36:21

标签: sql sqlite fts4

短篇小说。我正在开发一个需要与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

我希望听起来不会让人感到困惑。提前谢谢!

1 个答案:

答案 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*'

如果您的查询不起作用,可能是因为您使用了双引号。

来自the SQLite documentation

  

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

FTS4是一个提供match()功能的扩展程序。

是的,可以在第二个查询中使用多个条件。当您有一组复杂的条件时,了解条件的评估顺序非常重要。 AND始终在OR之前进行评估(它们分别与数学乘法和加法相似)。在实践中,我认为在使用ANDOR的组合时,最好使用括号来清晰:

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