将 MATCH 与 WHERE 语句中的 OR 子句组合

问题描述 投票:0回答:2

我想执行一个查询,其中

WHERE
子句具有以下条件:

  • MATCH
     表中某一列的 
    一个
    FTS3
    条件 或
  • MATCH
    表中某列的另一个非
    FTS
    条件。

示例

假设我有两张桌子

  • books_fts,这是一个带有 content 列的表,用于全文搜索。
  • books_tags,这是非
    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
分隔,则查询有效。

谢谢。

android sqlite full-text-search where-clause fts3
2个回答
1
投票

0
投票

这个 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

© www.soinside.com 2019 - 2024. All rights reserved.