SQL使用IN參量不能超過1000的表現形式以及解決辦法


 

如果出現這個錯誤說明你傳的參量是超過了一千個值;列如,你拼接了1001個id;

如何解決那,我這里提供兩種方法:

1.每1000條加一個or in

列:

原:select p.* from t_premium p where p.premium_id in ('0','1'........,'1000',......'2000');

現:select p.* from t_premium p where p.premium_id in ('0','1'......‘999’)or in (’1000',......'1999');

如何實現那?

看下邊

 

 1     public static void main(String[] agrs) throws Exception {
 2         StringBuffer thirdPartyPayId=new StringBuffer();
 3         for (int j = 0; j < 20; j++) {
 4             if((j%10) == 0 && j > 1){
 5                 thirdPartyPayId.deleteCharAt(thirdPartyPayId.length() -1);  6                 thirdPartyPayId.append(") OR " + "info.third_party_pay_id" + " IN ('" + j + "',");
 7             }else{
 8                 thirdPartyPayId.append("'").append(j).append("',");
 9             }
10         }
11         thirdPartyPayId.deleteCharAt(thirdPartyPayId.length() -1); 12         System.out.println(thirdPartyPayId.toString());
13     }

 

 我這里用j代替了循環的"info.third_party_pay_id" ,兄弟們用的時候可以遍歷自己的list,獲取參量;

thirdPartyPayId.deleteCharAt(thirdPartyPayId.length() -1):去掉多余的標點符號,不能省;

SELECT DISTINCT
               nvl(info.apply_policy_no,'無') applyPolicyNo
             FROM T_THIRD_PARTY_PAY_INFO info,t_department_define o
            WHERE info.department_code = o.internal_department_code(+)
            AND (info.third_party_pay_id IN ($thirdPartyPayId$ ))
            AND info.FLAG = '2'

注:1.這種方式效率很慢;數據量小的話也就無所謂;數據量大的話不建議使用;

  2.()這兩個括號必須要,因為(+)這個不能和in, not in 一起使用,但是因為

2.傳遞的參量轉換成一個sql查詢

SELECT DISTINCT
               nvl(info.apply_policy_no,'無') applyPolicyNo
             FROM T_THIRD_PARTY_PAY_INFO info,t_department_define o
            WHERE info.department_code = o.internal_department_code(+)
            AND info.third_party_pay_id IN (

    SELECT
                          sd.third_party_pay_id
                     FROM T_SOURCE_DOCUMENT sd,t_voucher v
                    WHERE sd.VOUCHER_ID = v.VOUCHER_ID and v.voucher_code=#voucherCode#
                    AND sd.third_party_pay_id IS NOT NULL
                    and v.CANCEL_STATUS != '2'

       )
            AND info.FLAG = '2'

就是說你獲取參量的那個查詢sql放進來;

 

后記:應該還有join以及exists兩種思路。但用起來感覺所鎖定目標不太清晰。故沒做考量;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM