【问题标题】:JAVA sql NOT IN list statementJAVA sql NOT IN 列表语句
【发布时间】:2012-10-24 10:12:58
【问题描述】:

我正在尝试从记录 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 循环中

【问题讨论】:

标签: java sql-server


【解决方案1】:

将您的 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();
}

【讨论】:

  • 返回错误,java.sql.SQLFeatureNotSupportedException: This operation is not supported
  • 你的 JDBC 版本不支持可选的 createArrayOf 操作。
  • 今天,我尝试了两种不同的 MSSQL 驱动程序(jtds 和 microsoft jdbc)。他们都没有实现这个功能。虽然它是 JDBC4 API 的一部分,但似乎只有少数驱动程序可以处理它(例如 PGSQL)。由于问题是关于 sql-server 的,这就是微软如何称呼它的 MSSQL,我想你的回答在这里并没有真正的帮助。
【解决方案2】:

我解决问题的方法是:

  1. SQL = "...WHERE ID NOT IN ({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 String finalSql = MessageFormat.format(SQL, questionMarksString);

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

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

【讨论】:

    【解决方案3】:

    你尝试过使用

        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[]数组的长度是未知的,是否可以在sql语句中加个循环自动增加问号?
    猜你喜欢
    • 1970-01-01
    • 2011-01-12
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多