我正在为我的程序实现一个搜索栏,它将根据用户输入查询数据库.当用户输入带有空格的单个搜索词(例如:I am searching for something)时,程序会将其视为空格分隔值,并在数据库的多个相关列中搜索每个值.一个示例查询(基于上面的搜索短语)为:

SELECT * FROM TableName WHERE (
  col1 LIKE "%I%" OR col2 LIKE "%I%" OR col3 LIKE "%I%" OR col4 LIKE "%I%" OR col5 LIKE "%I%"
OR col1 LIKE "%am%" OR col2 LIKE "%am%" OR col3 LIKE "%am%" OR col4 LIKE "%am%" OR col5 LIKE "%am%"
)

and so on for each space separated value in the input. As you can expect, this will be a very long query based on user input.
My question is, is there a better way to search for a single value in multiple columns? Or just a better way to implement a search like this one.

推荐答案

是的,SQLite通过FTS5模块提供全文搜索功能.首先,您需要创建一个虚表:

CREATE VIRTUAL TABLE virtual_table USING fts5(col1,col2,col3,col4,col5);

请注意,不能将类型、约束或主键声明添加到用于创建FTS5表的CREATE VIRTUAL TABLE语句.

像使用任何其他表一样,使用INSERT(UPDATE/DELETE)填充您的表:

INSERT INTO virtual_table (col1, col2, col3, col4, col5)
VALUES ('I', 'like', 'doughnuts', 'with', 'chocolate'),
       ('I', 'am', 'searching', 'for', 'something'),
       ('We', 'are', 'going', 'to', 'the park');

然后,您可以使用全文搜索功能的全部功能.有三种方法可以执行全文查询,有关详细信息,请参阅documentation.一种可能的 Select 是使用匹配运算符:

SELECT *
FROM virtual_table
WHERE virtual_table MATCH 'I am searching for something';

Sql相关问答推荐

错误LOS-00302:在Oracle中使用自定义类型时必须声明DBA_PICKLER组件

解析键-值对,根据值 Select ,并使用SQL创建新列

如何计算给定日期前三个月的值以及月初数据?

重用传递给 node 的参数-postgres upsert查询

如何根据行状态设置正确的标志

无法将发票与产品价格相关联

如何在Postgres中为单值输入多行?

如何将insert语句重复n次使一个值递增?

如何使用SQL生成数据的滚动3天总和

Athena 计算从日期到当前时间戳的每月计数

统计重复记录的总数

汇总具有连续日期范围的行

Postgres更新增量之间的差异

REGEXP_SUBSTR使用方法

比使用NOT EXISTS更高效的SQL删除方法是什么?

在给定的日期范围内填写缺失的日期

强制 SQL 始终通过 R 从视图中返回至少一行

忽略与给定列匹配的行的 LAG 函数

Postgres 条件求和函数

使用标准SQL 触发更新当前日期