考虑一个 users 表,该表有一个名为 name 的列,其中包含以下三行。
- 爱丽丝
- 鲍勃
- 卡尔
我想构造一个返回记录的查询,其中名称是输入的子字符串。例如,如果我查询 Alice Jackson,我想要 Alice。如果我搜索 Bobby,我想要 Bob。但如果我搜索 Car,我不想要匹配项。有点颠倒LIKE
。
这可以做到吗?并且可以使用 ActiveRecord 语法来完成吗?
考虑一个 users 表,该表有一个名为 name 的列,其中包含以下三行。
我想构造一个返回记录的查询,其中名称是输入的子字符串。例如,如果我查询 Alice Jackson,我想要 Alice。如果我搜索 Bobby,我想要 Bob。但如果我搜索 Car,我不想要匹配项。有点颠倒LIKE
。
这可以做到吗?并且可以使用 ActiveRecord 语法来完成吗?
您可以执行类似(SQL Server 语法)的操作:
SELECT name
FROM users
WHERE 'your query' + ' ' LIKE name + ' %';
以下将找到 Alice:
SELECT name
FROM users
WHERE 'Alice Jackson' + ' ' LIKE name + ' %';
SELECT name
FROM users
WHERE 'Alice' + ' ' LIKE name + ' %';
以下将找不到 Alice:
SELECT name
FROM users
WHERE 'Ali' + ' ' LIKE name + ' %';
我想出了 SQLite 的语法来做到这一点。
User.where("? LIKE name || '%'", query)
在 SQLite 中,双管道显然是连接所必需的。但是,正如 plalx 所示,不同的 SQL 服务器使用不同的方言,这使得我的应用程序数据库依赖于该查询。由于在大多数情况下,最终查询将包含附加子句,将这个逆向的潜在子集限制为LIKE
少于 10 条记录,因此我将提取这些记录并改为在应用程序级别执行匹配。
使用 ActiveRecordIN
表达式:
Client.where(:name => query.split(" "))
此代码将生成如下 SQL:
SELECT * FROM clients WHERE (clients.name IN ['Alice', 'Jackson']);