JDBC setNull()与Oracle"为null"产生不同的结果

Pet*_*ter 3 java oracle null jdbc

我正在针对Oracle 11g数据库在JDBC上进行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();
Run Code Online (Sandbox Code Playgroud)

与此查询不同:

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

我很好奇为什么会这样,我怎么能避免定义两个单独的SQL语句来涵盖"col2 = value"和"col2 is null"的情况.

Thi*_*ilo 6

这与Java无关,实际上,这就是NULL在Oracle中的工作原理.

与任何东西(甚至是NULL)相比,NULL总是为false,您必须使用IS NULL.

这也将不返回任何行:

SELECT col1 FROM tbl WHERE col2 = NULL
Run Code Online (Sandbox Code Playgroud)

甚至

SELECT col1 FROM tbl WHERE NULL = NULL
Run Code Online (Sandbox Code Playgroud)