【问题标题】:Sqlite Order By CaseSqlite 按案例排序
【发布时间】:2015-07-08 16:44:43
【问题描述】:

我正在尝试搜索联系人列表并按优先顺序向用户显示该列表。顺序是 display_name、电话、电子邮件和地址。我在 Stackoverflow 和 sqlite.org 上查看了一些示例,但没有运气。

如果用户搜索“john”,则 display_name 中所有带有“john”的联系人将首先出现,按降序排列,然后是可能居住在 Johnson City 的联系人等。搜索不区分大小写且有限制到 50 行。

    String[] projection = {
        DTab._id.toString(),
        DTab.contact_id.toString(),
        DTab.display_name.toString(),
        DTab.phone.toString(),
        DTab.email.toString(),
        DTab.kv.toString(),
        DTab.address.toString(),
};

String where = ""
    +"("+DTab.display_name+" LIKE ?) OR "
    +"("+DTab.phone+" LIKE ?) OR "
    +"("+DTab.email+" LIKE ?) OR "
    +"("+DTab.address+" LIKE ?)";
String[] args = new String[]{
        "%" + search + "%",
        "%" + search + "%",
        "%" + search + "%",
        "%" + search + "%",
};

String orderBy =
        "CASE "
        +"WHEN "+DTab.display_name+" LIKE ? != '' THEN 1 "
        +"WHEN "+DTab.phone       +" LIKE ? != '' THEN 2 "
        +"WHEN "+DTab.email       +" LIKE ? != '' THEN 3 "
        +"ELSE 4 "
+"END LIMIT 50";

Cursor c = detail_db.query(DETAIL_TABLE, projection, where, args, null, null, orderBy);

排序顺序不正确,好像忽略了定义的顺序。我得到一些匹配 display_name 的记录,然后是匹配电子邮件的记录,然后是更多 display_name 记录。感谢您提供有关如何调试它的见解或建议。

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    从您的订单子句中删除 != '' 比较:

    String orderBy = "CASE WHEN " + DTab.display_name + " LIKE ? THEN 1 "
            + "WHEN " + DTab.phone + " LIKE ? THEN 2 "
            + "WHEN " + DTab.email + " LIKE ? THEN 3 "
            + "ELSE 4 END ASC "
            + "LIMIT 50";
    

    【讨论】:

      【解决方案2】:

      您有七个参数 (?),但 args 数组中只有四个值,因此最后三个参数的值是 NULL

      您可以使用parameter numbers 重用参数值:

      String where = ""
          +"("+DTab.display_name+" LIKE ?1) OR "
          +"("+DTab.phone       +" LIKE ?2) OR "
          +"("+DTab.email       +" LIKE ?3) OR "
          +"("+DTab.address     +" LIKE ?4)";
      String orderBy =
          "CASE "
          +"WHEN "+DTab.display_name+" LIKE ?1 THEN 1 "
          +"WHEN "+DTab.phone       +" LIKE ?2 THEN 2 "
          +"WHEN "+DTab.email       +" LIKE ?3 THEN 3 "
          ...
      

      (正如 Karakuri 所说,!= '' 没有意义。)

      【讨论】:

      • 问题已解决。我添加了另外三个参数并删除了 != '' 正如 Karakuri 建议的那样,它运行良好。我和 CrypSafe 应用程序谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      相关资源
      最近更新 更多