JAVA sql不在列表语句中

JAVA sql不在列表语句中,java,sql-server,Java,Sql Server,我正在尝试从记录id不在列表中的数据库中选择记录 看看下面我的问题 String Sqlids = "2,6,3,9"; // this is dynamic so the number of element is unknown String str= "SELECT TOP 1 * FROM student WHERE ID NOT IN (2,6,3,9) ORDER BY NEWID()"; PreparedStatement stat = con.prepareStatement(s

我正在尝试从记录id不在列表中的数据库中选择记录

看看下面我的问题

String Sqlids = "2,6,3,9"; // this is dynamic so the number of element is unknown

String str= "SELECT TOP 1 * FROM student WHERE ID NOT IN (2,6,3,9) ORDER BY NEWID()";
PreparedStatement stat = con.prepareStatement(str);
ResultSet rs = stat.executeQuery();
上面的语句很好,但如果我将其更改为

String Sqlids = "2,6,3,9";
String str= "SELECT TOP 1 * FROM student WHERE ID NOT IN (Sqlids) ORDER BY NEWID()";
PreparedStatement stat = con.prepareStatement(str);
ResultSet rs = stat.executeQuery();

//i also try this
String Sqlids = "2,6,3,9";
String str= "SELECT TOP 1 * FROM student WHERE ID NOT IN (?) ORDER BY NEWID()";
PreparedStatement stat = con.prepareStatement(str);
stat.setString(1,Sqlids );

ResultSet rs = stat.executeQuery();
上面的语句无法过滤 由于Sqlids是一个字符串,并且将其视为一个参数,因此它返回重复的行,因此是否有整数格式来存储2,6,3,9之类的值? 因为SQLID来自一个名为SqlidList的arraylist 我试着这样做

Iterator iTr = SqlidList.iterator();
while(iTr.hasNext()){
    stat.setString(1,iTr.next().toString()+",");
}
但是设置字符串(1,--)不可用,因为它处于while循环中

您是否尝试使用

    int[] array = {2,6,3,9};
    String str= "SELECT TOP 1 * FROM student WHERE ID NOT IN (?,?,?,?) ORDER BY NEWID()";
    PreparedStatement stat = con.prepareStatement(str);
    for(int i = 1; i <= array.length; i++)
        stat.setString(i,array[i - 1]);

    ResultSet rs = stat.executeQuery();
int[]数组={2,6,3,9};
String str=“从学生中选择前1个*,其中新ID()的ID顺序不是(?,,?,?)”;
PreparedStatement=con.prepareStatement(str);

对于(int i=1;i我解决问题的方法是:

  • SQL=“…其中ID不在({0})

  • 有一个方法可以生成一个字符串,其中包含的?数等于SqlidList的大小

    public static String buildQuestionMarks(final int count) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < count; i++) {
       sb.append("?" + ",");
    }
    return sb.substring(0, sb.length() - 1);
    
    公共静态字符串buildQuestionMarks(最终整数计数){
    StringBuilder sb=新的StringBuilder();
    for(int i=0;i
    }

  • 使用java.text.MessageFormat.format()将?的列表插入sql语句 字符串finalSql=MessageFormat.format(SQL,问号字符串)

  • 有一个方法可以在准备好的语句上设置参数。虽然需要增加stat.setString()的第一个参数,但与您编写的类似

  • 这适用于可变数量的参数。

    在将ID转换为字符串[]后使用

    String[] ids = {"2", "6", "3", "9"};
    
    String str= "SELECT TOP 1 * FROM student WHERE ID NOT IN ? ORDER BY NEWID()";
    PreparedStatement stat = con.prepareStatement(str);
    stat.setArray(1, con.createArrayOf("text",ids));
    ResultSet rs = stat.executeQuery();
    
    如果您的JDBC驱动程序不支持createArrayOf(如本例中所示),我可能只在适当的位置构造查询字符串,例如:

    String Sqlids = "2,6,3,9";
    String str= "SELECT TOP 1 * FROM student WHERE ID NOT IN ("+Sqlids+") ORDER BY NEWID()";
    
    或者,如果您有一组ID,请使用实用程序方法创建数组内容:

    public static String toSqlArray(List<String> strings) {
        StringBuilder sb = new StringBuilder();
        boolean doneOne = false;
        for(String str: strings){
            if(doneOne){
                sb.append(", ");
            }
            sb.append("'").append(str).append("'");
            doneOne = true;
        }
        return sb.toString();
    }
    
    公共静态字符串toSqlArray(列表字符串){
    StringBuilder sb=新的StringBuilder();
    布尔doneOne=false;
    for(字符串str:strings){
    如果(doneOne){
    某人加上(“,”);
    }
    附加(str)附加(“”);
    doneOne=真;
    }
    使某人返回字符串();
    }
    
    如何增加(?)问号数量的可能重复?因为int[]数组未知,是否可以在sql语句中添加循环以自动增加问号?它返回错误,java.sql.SQLFeatureNotSupportedException:不支持此操作。您的JDBC版本不支持可选的createArrayOf操作。今天,我尝试了MSSQL的两个不同驱动程序(jtds和microsoft JDBC)。两者都没有实现此功能。虽然它是JDBC4 API的一部分,但似乎只有少数驱动程序可以处理它(例如PGSQL)。因为问题是关于sql server的,这是Microsoft如何调用其MSSQL的,我想您的回答在这里并没有真正的帮助。