我已经创建了一个虚拟表,并且正在执行以下不返回任何内容的查询:
SELECT * FROM table_search WHERE name MATCH 'Test'
如果我将匹配更改为‘=’或‘LIKE’,则查询将返回一行数据。
yhqotfr81#
正如documentation解释的那样:MATCH运算符是Match()应用程序定义函数的特殊语法。默认的Match()函数实现会引发异常,对任何事情都没有实际用处。但是扩展可以用更有用的逻辑覆盖Match()函数。如果您没有定义这样的函数,那么它将不选择任何行。如果您已经定义了这样的函数,则在您的问题中进行解释。否则,请坚持使用like、=或regexp。
MATCH
like
=
regexp
tcomlyy62#
我想知道戈登·利诺夫的回答发生了什么变化,因为他显然是SQLMaven,而我不是。只是谈谈我的亲身经历:对于FTS查询,不要指定列,而要指定表名:
SELECT * FROM table_search WHERE table_search MATCH 'Test'
我犯了同样的错误,甚至在阅读Gordon Linoff和文档的答案后,尝试从this repository实现一个定制的MATCH函数。Match运算符是Match()应用程序定义函数的特殊语法。默认的Match()函数实现会引发异常,对任何事情都没有实际用处。但是扩展可以用更有用的逻辑覆盖Match()函数。相反,如果我使用表名和Asterix 'Test*',我发现MATCH函数开箱即用(使用SQLite 3.39),但这只是因为我的特定数据集和一个错误的假设。自定义函数不会被MATCH调用,但如果我将其应用于类似于
'Test*'
SELECT match(name) FROM table_search WHERE table_search MATCH 'Test'
这是一个非常不同的意图。
2条答案
按热度按时间yhqotfr81#
正如documentation解释的那样:
MATCH
运算符是Match()应用程序定义函数的特殊语法。默认的Match()函数实现会引发异常,对任何事情都没有实际用处。但是扩展可以用更有用的逻辑覆盖Match()函数。如果您没有定义这样的函数,那么它将不选择任何行。如果您已经定义了这样的函数,则在您的问题中进行解释。否则,请坚持使用
like
、=
或regexp
。tcomlyy62#
我想知道戈登·利诺夫的回答发生了什么变化,因为他显然是SQLMaven,而我不是。只是谈谈我的亲身经历:
对于FTS查询,不要指定列,而要指定表名:
我犯了同样的错误,甚至在阅读Gordon Linoff和文档的答案后,尝试从this repository实现一个定制的
MATCH
函数。Match运算符是Match()应用程序定义函数的特殊语法。默认的Match()函数实现会引发异常,对任何事情都没有实际用处。但是扩展可以用更有用的逻辑覆盖Match()函数。
相反,如果我使用表名和Asterix
'Test*'
,我发现MATCH
函数开箱即用(使用SQLite 3.39),但这只是因为我的特定数据集和一个错误的假设。自定义函数不会被
MATCH
调用,但如果我将其应用于类似于这是一个非常不同的意图。