我正在使用JDBC对Oracle11g数据库执行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”两种情况。
发布于 2012-06-12 13:02:01
这与Java无关,实际上,这就是NULL在Oracle中的工作方式。
当与任何东西(甚至是NULL)进行比较时,NULL总是假的,您必须使用is NULL。
这也将不返回任何行:
SELECT col1 FROM tbl WHERE col2 = NULL甚至是
SELECT col1 FROM tbl WHERE NULL = NULL发布于 2020-03-10 17:41:40
如果您确定使用的是Oracle数据库,则可以使用此语句,它还将接受NULL等于NULL:
select col1 from tbl where decode(col2, ?, 1, 0)=1可读性不是很好,但比上面的表达式要好。此外,还可以避免将相同的值两次赋给准备好的语句。适用于我在Oracle 11或12上的工作。
https://stackoverflow.com/questions/10990749
复制相似问题