SQL FTS 和比较语句

Posted

技术标签:

【中文标题】SQL FTS 和比较语句【英文标题】:SQL FTS and comparison statements 【发布时间】:2012-10-24 07:36:20 【问题描述】:

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

有一个具有 nodeIdnodeName 列的 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 之前评估(它们分别类似于数学乘法和加法)。在实践中,我认为在使用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

【讨论】:

谢谢。在我的情况下,LIKE 是不可接受的 - 找到必要的条目将花费太多时间。 @besworland,对不起,我的第一个答案是错误的。请查看修改后的版本。 谢谢。但是在这种情况下,我会取回所有带有“Donald”的条目吗?在本文档中写到“*”必须放在短语中的某个位置? @besworland,只要您想将Donald 匹配为单独的单词,就不需要通配符。请参阅答案中的说明。 没错,重点是,我想要唐纳德​​的所有话。可以是麦当劳或唐老鸭什么的。

以上是关于SQL FTS 和比较语句的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server2012中的Throw语句尝试 RAISERROR和THROW比较

比较内连接和外连接 SQL 语句

sql 语句,查询条件,两个字段拼接和一个串比较怎从实现呢?sql 语句怎么写!谢谢!

存储过程跟SQL语句比较,各有啥优点和缺点?

sql server和my sql 命令(语句)的区别,sql server与mysql的比较

SQL语句中怎样比较两个日期的大小?