【问题标题】:Using Java's JDBC PreparedStatement on a SQLite Database to query for NOT NULL在 SQLite 数据库上使用 Java 的 JDBC PreparedStatement 查询 NOT NULL
【发布时间】:2013-03-05 22:28:33
【问题描述】:

我是 Java 中 PreparedStatement 的新手,我似乎无法找到解决问题的最佳解决方案。我想查询表中是否为 NULL 或 NOT NULL 的记录。

在阅读PreparedStatement (Java Platform SE 6)时,我意识到我需要使用setNull方法,但是我没有看到设置NOT NULL的方法?

例如:

SELECT * FROM table WHERE column IS NULL

我认为我会做的是:

public void query(boolean getNull) {
    String querySql = "SELECT * FROM table WHERE column IS ?";
    sqlStatement = connection.prepareStatement(querySql);
    if(getNull)
        sqlStatement.setNull(1, Types.VARCHAR);
    else
        ???;
}

但是我将如何执行 else 语句?没有 setNotNull 方法。我想我可以这样做:

public void query(boolean getNull) {
    String querySql = "SELECT * FROM table WHERE column IS ? NULL";
    sqlStatement = connection.prepareStatement(querySql);
    sqlStatement.setString(1, (getNull ? "" : "NOT"));
}

但这似乎很“骇人听闻”。有没有更好的方法来做到这一点?

谢谢

【问题讨论】:

  • 您能否描述一下您实际想要达到的目标(例如,提供一些示例数据和您想要获得的结果)。

标签: java sqlite jdbc null prepared-statement


【解决方案1】:

?用于传递参数,而不是构建 SQL。 (taken partially from here)

我建议您仅将参数用于值,而不是字段或 [IS] NULL(任何类似的东西)。

只需连接字符串。如果你有多个参数,你应该看看StringBuilder

public void query(boolean getNull) {
    String querySql = "SELECT * FROM table WHERE column IS ";
    if(getNull) {
        querySql += "NULL";
    } else {
        querySql += "NOT NULL";
    }      
    sqlStatement = connection.prepareStatement(querySql);
}

也可以使用String.format(...),例如:

public void query(boolean getNull) {
    String querySql = String.format("SELECT * FROM table WHERE column IS %s NULL", (getNull ? "" : "NOT")); 
    sqlStatement = connection.prepareStatement(querySql);
}

【讨论】:

  • 我明白了。我问的主要原因是我试图创建一个语句,该语句将使用单个查询返回某个值或所有值,具体取决于该值是否为空,但看起来更改查询是我所做的'将不得不做
【解决方案2】:

一种方法是查看查询返回的结果集:

"SELECT * FROM table WHERE column IS ?"

使用您的 PreparedStatement 将值设置为 NULL,然后执行查询。您可以使用resultset.next() 来测试您要查找的内容。

【讨论】:

  • 那不是只返回该列中具有 NULL 值的记录的结果集吗?
  • @TachisAlopex:没错。所以你的支票需要相应地放置。如果您希望您的列不为 NULL 并且结果集不为空,那么您就知道您的检查失败了。
  • 我的目标是在可能为空或不为空的值列中获取所有非空值。我还是一头雾水(对不起)
  • 我猜这实际上不适用于大多数驱动程序。
猜你喜欢
  • 2017-12-07
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多