【问题标题】:SQL query for records that are substrings of input对作为输入子字符串的记录的 SQL 查询
【发布时间】:2013-05-07 00:05:30
【问题描述】:

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

  • 爱丽丝
  • 鲍勃
  • 卡尔

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

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

【问题讨论】:

    标签: sql ruby-on-rails sqlite 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 + ' %';
    

    【讨论】:

    • 谢谢,答案比我想象的要简单得多。
    【解决方案2】:

    我想出了 SQLite 执行此操作的语法。

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

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

    【讨论】:

      【解决方案3】:

      使用 ActiveRecord IN 表达式:

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

      此代码将生成如下 SQL:

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

      【讨论】:

      • 我已经编辑了我的问题以使其更清楚。拆分空格并执行 IN 是不够的。 Bobby 必须归还 Bob。
      猜你喜欢
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多