java - JDBC setNull() 与 Oracle "is null"产生不同的结果

标签 java oracle jdbc null

我正在 JDBC 中针对 Oracle 11g 数据库执行 PreparedStatement 查询,发现传递 null 参数的结果与在查询本身中定义“is null”不同。

例如,这个查询:

String sql = "SELECT col1 FROM tbl WHERE col2 = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setNull(1, java.sql.Types.INTEGER);
ps.execute();

不同于此查询:

String sql = "SELECT col1 FROM tbl WHERE col2 is null";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setNull(1, java.sql.Types.INTEGER);
ps.execute();

我很好奇为什么会这样,以及如何避免定义两个单独的 SQL 语句来涵盖“col2 = value”和“col2 is null”两种情况。

最佳答案

这与 Java 无关,真的,这就是 NULL 在 Oracle 中的工作方式。

与任何事物(甚至与 NULL)相比,NULL 始终为假,您必须使用 IS NULL。

这也不会返回任何行:

SELECT col1 FROM tbl WHERE col2 = NULL

甚至

SELECT col1 FROM tbl WHERE NULL = NULL

关于java - JDBC setNull() 与 Oracle "is null"产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10990749/

相关文章:

java - org.hibernate.exception.JDBCConnectionException : could not execute query using hibernate

java - Jersey : combine multiple path params into one

java - ArrayList 调整大小

sql - 创建一个简单的用户界面来访问 Oracle 数据库

ruby-on-rails - Ruby on Rails与Oracle Objects(以及一般面向对象的数据持久性)

java - 如何设置连接属性?

Java 静态变量的序列化问题

java - Telegram API 如何通过 Telegram 用户名获取用户的名字和姓氏

oracle - 配置数据库连接池 - Axis2 webservice

java - 如何从 prepareCall 方法中获取自定义 CallableStatement 对象