SQL FTS 和比较语句
Posted
技术标签:
【中文标题】SQL FTS 和比较语句【英文标题】:SQL FTS and comparison statements 【发布时间】:2012-10-24 07:36:20 【问题描述】:短篇小说。我正在做一个需要与 SQLite 数据库通信的项目。我有几个问题:
有一个具有 nodeId 和 nodeName 列的 FTS 表。我需要选择 nodeNames 包含一些文本模式的所有 nodeIds。例如,所有带有“Donald”的节点名称。在thread 中讨论了类似的事情。关键是我不能使用 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
我希望这听起来不会很混乱。提前谢谢!
【问题讨论】:
【参考方案1】:编辑:抱歉,我错过了您使用 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
之前评估(它们分别类似于数学乘法和加法)。在实践中,我认为在使用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
【讨论】:
谢谢。在我的情况下,LIKE 是不可接受的 - 找到必要的条目将花费太多时间。 @besworland,对不起,我的第一个答案是错误的。请查看修改后的版本。 谢谢。但是在这种情况下,我会取回所有带有“Donald”的条目吗?在本文档中写到“*”必须放在短语中的某个位置? @besworland,只要您想将Donald
匹配为单独的单词,就不需要通配符。请参阅答案中的说明。
没错,重点是,我想要唐纳德的所有话。可以是麦当劳或唐老鸭什么的。以上是关于SQL FTS 和比较语句的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server2012中的Throw语句尝试 RAISERROR和THROW比较
sql 语句,查询条件,两个字段拼接和一个串比较怎从实现呢?sql 语句怎么写!谢谢!