我正在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总是为false,您必须使用IS NULL.
这也将不返回任何行:
SELECT col1 FROM tbl WHERE col2 = NULL
甚至
SELECT col1 FROM tbl WHERE NULL = NULL
标签:java,oracle,null,jdbc
来源: https://codeday.me/bug/20190725/1538538.html