我想执行一个查询,其中
WHERE
子句具有以下条件:
MATCH
表中某一列的一个
FTS3
条件
或MATCH
表中某列的另一个非 FTS
条件。示例:
假设我有两张桌子
FTS
带标签的表。我想搜索所有内容中包含“Dikjstra”或带有“算法”一词标记的书籍。所以我运行这个查询:
SELECT * from books_fts
LEFT OUTER JOIN books_tags ON books_fts.fk_id = books_tags.id
WHERE (books_fts MATCH 'content:%Dijkstra*')
OR (books_tags.tag = 'algorithm')
我认为查询是正确的,如果我使用任一
OR
子句运行它,它就会起作用。
但是,当使用两个子句运行它时,我收到以下错误:
unable to use function MATCH in the requested context
在我看来,我无法在
MATCH
子句中将 MATCH
与非 WHERE
组合起来,即使它们每个都适用于不同的表(一个 FTS
和另一个非 FTS
)。
这是真的?我找不到相关信息。
注意:如果因果关系用
AND
而不是 OR
分隔,则查询有效。
谢谢。
这似乎是 SQL 中的一个已知问题:
http://sqlite.1065341.n5.nabble.com/FTS3-bug-with-MATCH-plus-OR-td50714.html
这个 SQL 对我有用
select
*
from
"card"
inner join "note" on "card"."noteId" = "note"."id"
inner join "noteFtsTag" on "noteFtsTag"."rowid" = "note"."rowid"
inner join "cardFtsTag" on "cardFtsTag"."rowid" = "card"."rowid"
where
(
"noteFtsTag"."rowid" in (
select
"rowid"
from
"noteFtsTag"
where
"noteFtsTag"."tags" match ?
)
or "cardFtsTag"."rowid" in (
select
"rowid"
from
"cardFtsTag"
where
"cardFtsTag"."tags" match ?
)
)
来源:https://sqlite.org/forum/forumpost?udc=1&name=1a2f2ffdd80cf795