【问题标题】:Select all records whose specific field is not NULL选择特定字段不为 NULL 的所有记录
【发布时间】:2017-07-31 12:36:29
【问题描述】:

我有一个名为starsMySQL 表,其中一个字段是id_num,默认值为NULL。我想通过 中的PreparedStatement 选择id_num 不是 NULL 的所有记录。

现在我正在尝试这个:

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

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

但它不起作用。

【问题讨论】:

  • 这里不需要准备好的声明。只需使用select * from stars where id_num is not null
  • @Jens 我将如何将此字符串与数据库连接?我的意思是,现在我有 .executeQuery(); 。声明这个字符串后我会做什么?
  • .executeQuery(idStarsSQL); 。您也可以将其与准备好的语句一起使用,但不带参数
  • @Jens aah 所以你的意思是我应该删除声明preparedStatement.setString(1, NULL);,对吗?只需在我的字符串中写入NULL
  • 是的,我就是这个意思

标签: java java mysql select prepared-statement notnull


【解决方案1】:
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()));

【讨论】:

  • 这就是我的意思...根据您的回答,我确实需要一个 PreparedStatement。明白了,非常感谢!!
  • 好的,现在你改变了它。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    你可以使用:

    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");
    }
    

    你可以在这里了解更多关于PreparedStatementResulSet的信息

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-31
        相关资源
        最近更新 更多