【问题标题】:How to bind a SQL statement with multiple IN values?如何绑定具有多个 IN 值的 SQL 语句?
【发布时间】:2019-12-29 08:25:01
【问题描述】:

我正在尝试使用多个 IN 值触发查询,但在 sqlite open helper rawQuery() 中绑定参数

静态查询

SELECT * FROM invoices WHERE inIdUser IN (2,4,5)

但想这样做

String query = "SELECT * FROM invoices WHERE inIdUser IN (?)";
Cursor c = getWritableDatabase().rawQuery(query, new String[]{"2,4,5"};

它不显示结果,也没有任何错误出现 但是如果我只传递一个值,比如

Cursor c = getWritableDatabase().rawQuery(query, new String[]{"2"});

然后工作

【问题讨论】:

  • WHERE IN 子句中是否总是只有三个值?
  • 不,先生,这只是一个例子,它会有不同的值
  • inIdUser 列是否包含 单个 数值,还是包含 CSV?
  • SELECT * FROM invoices WHERE inIdUser IN (?,?,?) 然后将每个参数绑定到一个数字。

标签: android database sqlite android-sqlite sqliteopenhelper


【解决方案1】:

你使用rawQuery()的方式会是这样的:

SELECT * FROM invoices WHERE inIdUser IN ('2,4,5')

因为占位符将替换为用单引号括起来的字符串文字"2,4,5"
这就是为什么这不起作用。

您可以做的是改用运算符LIKE

SELECT * FROM invoices WHERE ',' || ? || ',' LIKE '%,' || inIdUser || ',%'

替换占位符后会是:

SELECT * FROM invoices WHERE ',' || '2,4,5' || ',' LIKE '%,' || inIdUser || ',%'

或:

SELECT * FROM invoices WHERE ',2,4,5,' LIKE '%,' || inIdUser || ',%'

所以这样写你的代码:

String query = "SELECT * FROM invoices WHERE ',' || ? || ',' LIKE '%,' || inIdUser || ',%'";
Cursor c = getWritableDatabase().rawQuery(query, new String[]{"2,4,5"});

【讨论】:

  • 如果我正确理解 OP,inIdUser 列包含 individual ID 值,而不是 CSV,因此您的答案方向错误。
  • 我对查询的理解:SELECT * FROM invoices WHERE inIdUser IN (2,4,5)inIdUser 是表格的一列。
  • 如果你描述了它是如何工作的:Cursor c = getWritableDatabase().rawQuery(query, new String[]{"2"}); 正如 OP 最后所说的那样。
  • 这似乎有效,因为原始查询变成了WHERE inIdUser IN ('2')。在任何情况下,许多准备好的语句框架都无法处理带有任意数量参数的WHERE IN
  • 如果inIdUser 不是表中的列而是变量,则语句不会按原样编译。该变量应通过串联或占位符替换为其实际值。问题中没有描述类似的内容。
【解决方案2】:

遗憾的是,没有办法将 (2,4,5) 转化为单个值。 "?, ?, ..., ?" 形式的字符串可以动态创建并安全地放入原始 SQL 查询中

String[] ids = { 2, 4, 5 }; // set ids
String query = "SELECT * FROM invoices"
    + " WHERE inIdUser IN (" + TextUtils.join(",", Collections.nCopies(ids.length, "?"))  + ")";
Cursor c = getWritableDatabase().rawQuery(query, ids);

【讨论】:

  • 谢谢哥们,我不明白这是最终的解决方案
  • TextUtils.join(",", Collections.nCopies(ids.length, "?")) 将为您创建 (?,?,?)。 “?”根据“ids.length”是动态的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2011-05-26
相关资源
最近更新 更多