1

短篇故事。我正在做一个需要与 SQLite 数据库通信的项目。我有几个问题:

有一个包含nodeIdnodeName列的 FTS 表。我需要选择 nodeNames 包含一些文本模式的所有 nodeIds。例如,所有带有“Donald”的节点名称。在这个线程中讨论了类似的事情。关键是我不能使用CONTAINS关键字。相反,我使用MATCH。这就是问题本身:这个“Donald”字符串应该如何“装帧”?使用 '*' 还是使用 '%' 字符?这是我的查询:

SELECT * FROM nodeFtsTable WHERE nodeName MATCH "Donald"

在SELECT语句中写多重比较可以吗?我的意思是这样的:

SELECT * FROM distanceTable WHERE pointId = 1 OR pointId = 4 OR pointId = 203 AND distance<200

我希望这听起来不会很混乱。先感谢您!

4

1 回答 1

2

编辑:对不起,我错过了您使用 FTS4 的事实。看起来你可以这样做:

SELECT * FROM nodeFtsTable WHERE nodeName MATCH 'Donald'

这是相关文档。

不需要通配符来匹配所有Donald离散单词的条目(例如,上面将匹配Donald Duck)。如果您想Donald作为单词的一部分进行匹配(例如Donalds),那么您需要*在适当的位置使用:

SELECT * FROM nodeFtsTable WHERE nodeName MATCH 'Donald*'

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

SQLite 文档

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

FTS4 是提供match()功能的扩展。

是的,可以在第二个查询中使用多个条件。当您有一组复杂的条件时,了解评估条件的顺序很重要。AND总是在之前进行评估OR(它们分别类似于数学乘法和加法)。AND在实践中,我认为在使用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
于 2012-10-24T07:42:41.463 回答