[我正在针对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();
与该查询的不同:
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
我相信ps.setNull(1, java.sql.Types.INTEGER)
用于将[[插入 NULL数据值插入数据库。
IS NULL
数据值,则应使用NULL
。>>毕竟,col2 = NULL
也不起作用,因为您无法使用NULL
比较=
的值