【问题标题】:Using prepared statements and full-text-search in SQLite在 SQLite 中使用准备好的语句和全文搜索
【发布时间】:2011-02-07 19:20:51
【问题描述】:

我正在使用 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 关键字一起使用的语句来返回所有行。有这样的说法吗?

【问题讨论】:

    标签: sqlite full-text-search prepared-statement


    【解决方案1】:

    我建议如下:

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

    【讨论】:

    • 您确定此代码有效吗?当我将 NULL 绑定为参数 3 时,它的行为符合要求。当我绑定一个实际的字符串时,我收到错误“无法在请求的上下文中使用函数 MATCH”。
    【解决方案2】:

    我最终在运行时修改了 SQL 语句,将 MATCH 替换为 LIKE '%'。不是很优雅,但现在可以使用。

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      相关资源
      最近更新 更多