【问题标题】:Search predicate for searching first and last name in sqlite?在sqlite中搜索名字和姓氏的搜索谓词?
【发布时间】:2012-12-06 09:57:39
【问题描述】:

想象以下联系人:

{
  first_name:"Walter",
  last_name:"White"
}

我希望以下搜索字符串返回该联系人:

  • Walter White
  • White Walter

但是,上述搜索字符串不应返回以下联系人:

{
  first_name:"Skylar",
  last_name:"White"
}

{
  first_name:"Walter",
  last_name:"Grey"
}

我正在尝试通过编写一个 sqlite 谓词来实现这一点。

我在想这一定是一个很常见的问题,但是我在这里没有找到可以回答这个问题的问题。

【问题讨论】:

    标签: sql sqlite search predicate


    【解决方案1】:
    SELECT *
    FROM MyTable
    WHERE first_name || ' ' || last_name = ?
       OR last_name || ' ' || first_name = ?
    

    【讨论】:

    • 这就是我已经实现的(除了我使用 LIKE 而不是 =),但它不适用于双重名称。
    • @ErikB 如果你的意思是像“Mary Sue Jones”这样的名字,只要你保持 Mary 和 Sue 的顺序正确,CL 的答案就可以解决问题。例如只有“Jones Mary Sue”和“Mary Sue Jones”是正确的搜索,但不是“Jones Sue Mary”。
    • @Maple 是的,但问题是它不适用于“玛丽琼斯”。
    • @ErikB 你说的是做部分匹配。例如密歇根返回迈克尔,沃尔特返回沃尔特,玛丽返回玛丽苏,等等。
    • @ErikB 在 CL 的基础上,我在下面找到了一个解决双重名称问题的解决方案。
    【解决方案2】:

    从 CL 的答案中的 cmets 工作: 您正在谈论进行部分匹配。例如密歇根返回迈克尔,沃尔特返回沃尔特,玛丽返回玛丽苏,等等。

    编辑:

    使用一点反向 LIKE 技巧和一些输入填充,您会得到:

    SELECT *
    FROM People_Table
    WHERE first_name || ' ' last_name LIKE '%' || (SELECT replace(inputString, ' ', '%')) || '%'
       OR last_name || ' ' first_name LIKE '%' || (SELECT replace(inputString, ' ', '%')) || '%'
    

    对于像“Mary Sue Jones”这样的双重名称,以下内容将全部匹配: 《玛丽·琼斯》、《琼斯》、《苏·琼斯》、《琼斯·苏》、《苏·玛丽》、《玛丽·苏·琼斯》等。 这种方法的缺点是,如果双名的部分在搜索字符串中乱序,它将不匹配。您必须超出这个 SQLite 谓词才能处理它。

    【讨论】:

      【解决方案3】:

      先分开然后搜索 FirstName = firstname 和 LastName = lastname 然后反转以防万一用户先输入姓氏

      try {       
          int firstSpace = search_str.indexOf(" "); // detect the first space character
          firstName = search_str.substring(0, firstSpace);  // get everything upto the first space character
          lastName = search_str.substring(firstSpace).trim(); // get everything after the first space, trimming the spaces off
              }
      catch (Exception c){}
      

      FIRST_NAME LIKE '%"+firstName+"%' AND LAST_NAME LIKE '%"+lastName+"%' OR FIRST_NAME LIKE '%"+lastName+"%' AND LAST_NAME LIKE '%"+firstName+"%'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2012-02-19
        • 1970-01-01
        • 2013-05-22
        • 1970-01-01
        相关资源
        最近更新 更多