1

考虑一个 users 表,该表有一个名为 name 的列,其中包含以下三行。

  • 爱丽丝
  • 鲍勃
  • 卡尔

我想构造一个返回记录的查询,其中名称是输入的子字符串。例如,如果我查询 Alice Jackson,我想要 Alice。如果我搜索 Bobby,我想要 Bob。但如果我搜索 Car,我不想要匹配项。有点颠倒LIKE

这可以做到吗?并且可以使用 ActiveRecord 语法来完成吗?

4

3 回答 3

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 + ' %';
于 2013-05-13T02:17:27.280 回答
1

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

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

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

于 2013-05-13T02:38:16.103 回答
0

使用 ActiveRecordIN表达式:

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

此代码将生成如下 SQL:

SELECT * FROM clients WHERE (clients.name IN ['Alice', 'Jackson']);
于 2013-05-13T02:25:00.323 回答