解决的方法是拆分列表。
需求是提供了:号单文件,必须按号单文件查询,如果是表查询,当然可以采用join关联等实现。
为了把几千个号单拆分成100个为一组,写了个Java方法,进行sql语句的处理。
- /**
- * Example:
- * List sqhlist=[aa,bb,cc,dd,ee,ff,gg] ;
- * Test.getSqlStrByList(sqhList,3,"SHENQINGH")=
- * "SHENQING IN ('aa','bb','cc') OR SHENQINGH IN ('dd','ee','ff') OR SHENQINGH IN ('gg')"
- *
- * 把超过1000的申请号集合拆分成数量splitNum的多组sql的in 集合。
- * @param sqhList 申请号的List
- * @param splitNum 拆分的间隔数目,例如: 1000
- * @param columnName SQL中引用的字段名例如: Z.SHENQINGH
- * @return
- */
- public String getSqlStrByList(List sqhList, int splitNum,String columnName) {
- if(splitNum>1000) //因为<a href="http://lib.csdn.net/base/14" class='replace_word' title="MySQL知识库" target='_blank' style='color:#df3434; font-weight:bold;'>数据库</a>的列表sql限制,不能超过1000.
- return null;
- StringBuffer sql = new StringBuffer("");
- if (sqhList != null) {
- sql.append(" ").append(columnName).append (" IN ( ");
- for (int i = 0; i < sqhList.size(); i++) {
- sql.append("'").append(sqhList.get(i) + "',");
- if ((i + 1) % splitNum == 0 && (i + 1) < sqhList.size()) {
- sql.deleteCharAt(sql.length() - 1);
- sql.append(" ) OR ").append(columnName).append (" IN (");
- }
- }
- sql.deleteCharAt(sql.length() - 1);
- sql.append(" )");
- }
- return sql.toString();
- }
- /**
- * 把超过1000的申请号数组拆分成数量splitNum的多组sql的in 集合。
- * @param sqhArrays 申请号的数组
- * @param splitNum 拆分的间隔数目,例如: 1000
- * @param columnName SQL中引用的字段名例如: Z.SHENQINGH
- * @return
- */
- public String getSqlStrByArrays(String[] sqhArrays, int splitNum,String columnName){
- return getSqlStrByList(Arrays.asList(sqhArrays),splitNum,columnName);
- }