对作为输入子字符串的记录的SQL查询

时间:2013-05-13 01:47:30

标签: sql ruby-on-rails sqlite activerecord

考虑具有名为name的列的users表,该列具有以下三行。

  • 爱丽丝
  • 鲍勃
  • 卡尔

我想构造一个返回记录的查询,其中name是输入的子字符串。例如,如果我查询Alice Jackson,我想要Alice。如果我搜索Bobby,我想要Bob。但如果我搜索汽车,我想要没有比赛。反转LIKE

的排序

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

3 个答案:

答案 0 :(得分:1)

您可以执行类似( 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 + ' %';

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

使用ActiveRecord IN表达式:

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

此代码将生成如下SQL:

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