我必须执行以下查询通过JDBC调用
select primaryid from data where name in ("abc", adc", "anx");
问题在第1条中,我必须传递11000个字符串。我可以在这里使用预备声明吗?或任何人可以建议的任何其他解决方案。我不想为每条记录执行查询,因为它耗费时间。我需要在很短的时间内运行这个查询。
我正在使用DOMParser从XML文件中读取字符串。我正在使用sql server db。
答案 0 :(得分:2)
我只是想知道为什么你需要手动设置11,000个项目,你需要指定每个项目。听起来你需要将数据带入临时表 (当然没有从UI中选择..?),然后加入到那里以获得所需的结果集。
答案 1 :(得分:1)
使用带有11k字面值的IN子句是一个非常糟糕的主意 - 我知道一个主要的RDBMS(Oracle)在IN列表中不支持超过1k的值。
你能做什么呢?
T_NAMES
来保存你的名字;如果您的RDBMS不支持“真实”(会话特定的)临时表,则必须添加某种会话ID 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;