在SQLite中使用准备好的语句和全文搜索

在SQLite中使用准备好的语句和全文搜索,sqlite,full-text-search,prepared-statement,Sqlite,Full Text Search,Prepared Statement,我正在使用SQLite C接口编写一个应用程序。因为我喜欢安全性,所以我使用准备好的语句来查询数据库。在一个这样的查询中,我使用MATCH关键字从虚拟数据库中选择行进行全文搜索。下面是一个例子: SELECT * FROM Emails WHERE ( Subject LIKE ?001 OR ?001 IS NULL ) AND ( Author LIKE ?002 OR ?002 IS NULL ) AND ( Body MATCH ?003 OR ?003 IS NULL ) 这

我正在使用SQLite C接口编写一个应用程序。因为我喜欢安全性,所以我使用准备好的语句来查询数据库。在一个这样的查询中,我使用MATCH关键字从虚拟数据库中选择行进行全文搜索。下面是一个例子:

SELECT * FROM Emails
WHERE ( Subject LIKE ?001 OR ?001 IS NULL )
  AND ( Author LIKE ?002 OR ?002 IS NULL )
  AND ( Body MATCH ?003 OR ?003 IS NULL )

这允许用户单独或以任意组合输入任何术语(主题、作者或正文)进行搜索。任何未输入的术语,我都会将NULL绑定到该参数。该语句的问题是不能将OR关键字与MATCH关键字一起使用。我正在寻找一条语句,如果不在Body列中搜索,我可以使用MATCH关键字返回所有行。有这样的说法吗?

我建议如下:

SELECT * FROM emails
WHERE ...
  AND ( CASE (SELECT COUNT(*) FROM emails WHERE body MATCH ?003)
        WHEN 0 THEN 1
        ELSE body MATCH ?003
         END )

最后,我在运行时修改了SQL语句,将MATCH替换为类似“%”的语句。不是很优雅,但它现在可以工作。

您确定这段代码可以工作吗?当我将NULL绑定为参数3时,它的行为符合要求。当我绑定一个实际的字符串时,会出现错误“无法在请求的上下文中使用函数匹配”。