Select 特定字段不为 NULL 的所有记录

Select all records whose specific field is not NULL

我有一个名为 starsMySQL table,它的字段之一是 id_num,默认值为 NULL。我想 select id_num 不是 NULL 的所有记录 PreparedStatement

现在我正在尝试这个:

private final String idStarsSQL = "select * from `stars` where id_num is not ?";
...

preparedStatement = (PreparedStatement) connection.prepareStatement(idStarsSQL);
preparedStatement.setString(1, NULL);
set = preparedStatement.executeQuery();

但它不起作用。

private final String idStarsSQL = "select * from `stars` where id_num is not NULL";

你不需要PreparedStatement

从我的角度来看,PreparedStatement 应该用于 SQL 带参数的语句。使用带有参数的 SQL 语句的优点是您可以使用相同的语句并在每次执行时为其提供不同的值。

Statement statement = con.createStatement();
    ResultSet result = statement.executeQuery("select username, age, nickname from user where nickname is not NULL");
    List<User> allUserNullNickname = new ArrayList<>();
    while(result.next()){
        User user = new User();
        user.setUsername(result.getString("username"));
        user.setAge(result.getInt("age"));
        allUserNullNickname.add(user);
    }
    System.out.println("All user without nickname:");
    allUserNullNickname.stream().forEach(user -> System.out.println("username: "+user.getUsername()+" Age: "+user.getAge()));

因为 null 不是一个值,它更像是 SQL 中的一个关键字,所以你必须将它硬编码到你的 sql 语句中

private final String idStarsSQL = "select * from `stars` where id_num is not NULL";

您可以使用:

PreparedStatement preparedStatement = 
            connection.prepareStatement("select * from `stars` where id_num is not NULL");
ResultSet result = preparedStatement.executeQuery();

while (result.next()) {
    result.getString("attribute1");
    result.getString("attribute2");
}

您可以在此处了解有关 PreparedStatement and about ResulSet

的更多信息

preparedStatement 的主要功能是将参数插入到 SQL 语句中,在您的情况下您不需要这样做,因为 null 不是参数,因此您可以清楚地做到:

PreparedStatement myRequest= 
            connection.prepareStatement("select * from `stars` where id_num is not NULL");
ResultSet myResult= preparedStatement.executeQuery();