5

我正在尝试从记录 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 之类的值的整数格式?因为 Sqlids 来自一个名为 SqlidList 的数组列表,所以我尝试这样的 somtin

Iterator iTr = SqlidList.iterator();
while(iTr.hasNext()){
    stat.setString(1,iTr.next().toString()+",");
}

但 setString(1,--) 不可用,因为它在一个 while 循环中

4

3 回答 3

6

将您的 id 转换为 String[] 后使用Connection#createArrayOf

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();
}
于 2012-10-24T11:07:26.667 回答
2

我解决问题的方法是:

  1. SQL = "...ID 不在 ({0}) ..."

  2. 有一种方法可以构建一个包含多个?等于 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);
    

    }

  3. 使用 java.text.MessageFormat.format() 插入列表?进入 sql 字符串 finalSql = MessageFormat.format(SQL, questionMarksString);

  4. 有一种方法可以在准备好的语句上设置参数。类似于您所写的内容,尽管您需要增加 stat.setString() 的第一个参数

这应该适用于可变数量的参数。

于 2012-10-24T10:39:28.040 回答
1

您是否尝试过使用

    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();
于 2012-10-24T10:21:49.523 回答