在 SQL 查询中创建任意大小的列表

Creating lists of arbitrary size in SQL queries

我想创建一个这样的 SQL 语句:

SELECT COUNT(*) FROM table WHERE id IN (1, 2, 3, ..., n)

但我不知道如何将任意数量的值插入到该语句中。

我试过这个:

SELECT COUNT(*) FROM table WHERE id IN (?)

我用的地方preparedStatement.setString(1, "1, 2, 3, ..., n")(字符串是通过代码构建的)

但是H2抛出数据转换异常

org.h2.jdbc.JdbcSQLException: Data conversion error converting "1, 2, ..."; SQL statement:

我如何绕过它并让 H2 将其正确解释为整数列表而不是字符串?

您需要将每个值添加为单独的 JDBC 参数 (?)。为此,您需要以动态方式 assemble 查询。您的代码可能如下所示:

List<Integer> values = ...
String sql = "SELECT COUNT(*) FROM table WHERE id IN (" +
  values.stream().map(v -> "?").collect(Collectors.joining(", ") +
  ")";
PreparedStatement ps = conn.prepareStatement(sql);
int param = 1;
for (Integer v : values) {
  ps.setInt(param++, v);
}

注意:您还应该考虑H2数据库和H2 JDBC驱动程序可能会对SQL语句的长度以及参数个数。作为一般规则,所有数据库都接受少于 10000 个字符和少于 100 个参数的 SQL 语句。但是,如果您超出这些基本限制,我会查看 H2 的文档。