考虑具有名为name的列的用户表,该列具有以下三行。SQL查询是输入的子字符串的记录
- 爱丽丝
- 鲍勃
- 卡尔
我想构建一个返回其名称是输入的字符串记录的查询。例如,如果我查询Alice Jackson,我想要Alice。如果我搜索Bobby,我想要Bob。但是如果我搜索汽车,我不想要匹配。排序的逆转LIKE
。
可以这样做吗?而且可以使用ActiveRecord语法来完成吗?
考虑具有名为name的列的用户表,该列具有以下三行。SQL查询是输入的子字符串的记录
我想构建一个返回其名称是输入的字符串记录的查询。例如,如果我查询Alice Jackson,我想要Alice。如果我搜索Bobby,我想要Bob。但是如果我搜索汽车,我不想要匹配。排序的逆转LIKE
。
可以这样做吗?而且可以使用ActiveRecord语法来完成吗?
你可以这样做(SQL Server语法):
SELECT name
FROM users
WHERE 'your query' + ' ' LIKE name + ' %';
下面将找到爱丽丝:
SELECT name
FROM users
WHERE 'Alice Jackson' + ' ' LIKE name + ' %';
SELECT name
FROM users
WHERE 'Alice' + ' ' LIKE name + ' %';
下不会找到爱丽丝:
SELECT name
FROM users
WHERE 'Ali' + ' ' LIKE name + ' %';
使用ActiveRecord IN
expressi于:
Client.where(:name => query.split(" "))
此代码会产生这样的SQL:
SELECT * FROM clients WHERE (clients.name IN ['Alice', 'Jackson']);
我编辑了我的问题,使其更清晰。分割空间并进行IN是不够的。鲍比必须回来鲍勃。 – 2013-05-13 02:29:21
我想通了语法SQLite的做到这一点。
User.where("? LIKE name || '%'", query)
双管道显然是在SQLite中连接的必要条件。但是,正如plalx所示,不同的SQL服务器使用不同的方言,这使得我的应用程序数据库依赖于此查询。由于最终查询将包含额外的子句,因此在大多数情况下,将此逆向LIKE
的潜在子集限制为少于10条记录,因此我将取消这些记录并在应用程序级别执行匹配。
谢谢你,答案比我预想的要简单得多。 – 2013-05-13 02:38:58