如何使用in子句中的单个变量中的许多值在Java中执行SQL语句

时间:2014-02-28 10:38:23

标签: java sql sql-server jdbc prepared-statement

我必须执行以下查询通过JDBC调用

select primaryid from data where name in ("abc", adc", "anx");

问题在第1条中,我必须传递11000个字符串。我可以在这里使用预备声明吗?或任何人可以建议的任何其他解决方案。我不想为每条记录执行查询,因为它耗费时间。我需要在很短的时间内运行这个查询。

我正在使用DOMParser从XML文件中读取字符串。我正在使用sql server db。

4 个答案:

答案 0 :(得分:2)

我只是想知道为什么你需要手动设置11,000个项目,你需要指定每个项目。听起来你需要将数据带入临时表 (当然没有从UI中选择..?),然后加入到那里以获得所需的结果集。

答案 1 :(得分:1)

使用带有11k字面值的IN子句是一个非常糟糕的主意 - 我知道一个主要的RDBMS(Oracle)在IN列表中不支持超过1k的值。

你能做什么呢?

  • 创建某种(临时)表T_NAMES来保存你的名字;如果您的RDBMS不支持“真实”(会话特定的)临时表,则必须添加某种会话ID
  • 在此表中填写您正在寻找的名称
  • 修改您的查询以使用临时表而不是IN列表:select primaryid from data where name in (select name from T_NAMES where session_id = ?session_id)或(可能更好)select primaryid from data join t_names on data.name = t_names.name and t_names.session_id = ?session_id(此处,?session_id表示用于传递会话ID的绑定变量)< / LI>

答案 2 :(得分:0)

预先准备好的陈述需要提前知道参数的数量 - 具体如下:

PreparedStatement stmt = conn.prepareStatement(
    "select id, name from users where id in (?, ?, ?)");
stmt.setInt(1);
stmt.setInt(2);
stmt.setInt(3);

11,000是大量参数。最简单的方法是使用here描述的“批处理”方法(总结 - 使用预处理语句循环参数 每一次)

注意 - 如果您的11,000个字符串是早期数据库选择的结果,那么最好的方法是编写一个存储过程来在数据库中进行整个计算(避免使用您的代码来回传递11,000个字符串)< / p>

答案 3 :(得分:0)

您可以将所有参数字符串合并为一个以';'分隔的bitg字符串炭

bigStrParameter = “; ABC; ADC; ANX;”

使用LOCATE查找子字符串。

select primaryid from data where LOCATE(concat(';',name,';'),?)>=0;