【问题标题】:Sqlite Query for multiple values in one columnSqlite 查询一列中的多个值
【发布时间】:2012-01-10 18:02:12
【问题描述】:

我想在表中查询字段 id,其中包含一些值,例如 1、5、4、11,这些值将根据选择来自上一个屏幕。

cursor = database.query(tablename,
                    new String[] { "TopName" }, "id =?", new String[]{"2,3"}, null, null, null);

当我这样做时,我的光标计数为 0,使用 new String[]{"2"} 我得到了我想要的所有 id 的值,这些 id 的值在字符串数组中,如 OR,在该列中有值。

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    你可以像这样使用 IN 运算符,

    cursor = database.query(tablename, new String[] {"TopName"}, "id IN(?,?)", 
                                            new String[]{"2","3"}, null, null, null);
    

    【讨论】:

    • 如果我们想再匹配一个相同场景的列怎么办?
    【解决方案2】:

    在Android的ContentProvider中使用IN操作符的正确语法如下:

    cursor = database.query(contentUri, projection, "columname IN(?,?)", new String[]{"value1" , "value2"}, sortOrder);
    

    或者,我们也可以使用,

    cursor = database.query(contentUri, projection, "columnName IN(?)", new String[] {" 'value1' , 'value2' "}, sortOrder);
    

    请注意,第二种情况的参数中的每个逗号分隔值都需要单引号,否则整个字符串将被视为列的一个值。 SQL 会将其视为

    SELECT * FROM table WHERE columnName IN ('value1,value2')

    而不是正确的语法

    SELECT * FROM table WHERE columnName IN ('value1' , 'value2')

    【讨论】:

      【解决方案3】:

      VolkerK 是第一个正确回答问题的人,但为了完整起见,这里有一个完整的示例来说明如何使用 IN 运算符:

      cursor = database.query(tablename,
                      new String[] { "TopName" }, "id IN (?)", new String[]{"2,3"}, null, null, null);
      

      【讨论】:

        【解决方案4】:

        使用IN operator 代替相等比较 (=)。

        【讨论】:

          【解决方案5】:

          对于 SelectionArgs 部分,我认为您需要更改:

          new String[]{"2,3"}
          

          new String[]{"2","3"}
          

          【讨论】:

          • 这不是 OP 正在寻找的,它实际上会导致错误,因为提供的参数数量与 ? 字段的数量不同。 VolkerK 的回答是正确的。
          • 哦,好吧...我现在明白了。那我和ud_an有同样的问题。上面查询中的“IN”运算符如何使用?
          【解决方案6】:

          我想把它放在这里,因为答案纲要帮助我在SQLiteDatabase.query() 中输入了多个(未知)值,而一个问号对我不起作用。希望对任何人都有帮助

          // API > 24
          protected String attributesAsMarks(String[] attributes) {
              List<String> marks = Collections.nCopies(attributes.length, "?");
          
              return marks.stream().collect(Collectors.joining(","));
          }
          
          // I'm using API > 15
          protected String attributesAsMarks(String[] attributes) {
              StringBuilder sb = new StringBuilder();
              String separator = "";
          
              for (String s : attributes) {
                  if (s == null) continue;
          
                  sb.append(separator).append("?");
                  separator = ",";
              }
          
              return sb.toString();
          }
          

          感谢

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-02-21
            • 1970-01-01
            • 2021-09-12
            • 2013-10-29
            相关资源
            最近更新 更多