2013-05-13 58 views
1

考虑具有名为name的列的用户表,该列具有以下三行。SQL查询是输入的子字符串的记录

  • 爱丽丝
  • 鲍勃
  • 卡尔

我想构建一个返回其名称是输入的字符串记录的查询。例如,如果我查询Alice Jackson,我想要Alice。如果我搜索Bobby,我想要Bob。但是如果我搜索汽车,我不想要匹配。排序的逆转LIKE

可以这样做吗?而且可以使用ActiveRecord语法来完成吗?

回答

1

你可以这样做(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 + ' %'; 
+0

谢谢你,答案比我预想的要简单得多。 – 2013-05-13 02:38:58

0

使用ActiveRecord IN expressi于:

Client.where(:name => query.split(" ")) 

此代码会产生这样的SQL:

SELECT * FROM clients WHERE (clients.name IN ['Alice', 'Jackson']); 
+0

我编辑了我的问题,使其更清晰。分割空间并进行IN是不够的。鲍比必须回来鲍勃。 – 2013-05-13 02:29:21

0

我想通了语法SQLite的做到这一点。

User.where("? LIKE name || '%'", query) 

双管道显然是在SQLite中连接的必要条件。但是,正如plalx所示,不同的SQL服务器使用不同的方言,这使得我的应用程序数据库依赖于此查询。由于最终查询将包含额外的子句,因此在大多数情况下,将此逆向LIKE的潜在子集限制为少于10条记录,因此我将取消这些记录并在应用程序级别执行匹配。