Java JDBC setNull()与Oracle的比较;是空的;产生不同的结果

Java JDBC setNull()与Oracle的比较;是空的;产生不同的结果,java,oracle,jdbc,null,Java,Oracle,Jdbc,Null,我正在JDBC中针对oracle11g数据库进行PreparedStatement查询,发现传递null参数的结果与在查询本身中定义“isnull”不同 例如,此查询: String sql = "SELECT col1 FROM tbl WHERE col2 = ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setNull(1, java.sql.Types.INTEGER); ps.execute(); String s

我正在JDBC中针对oracle11g数据库进行PreparedStatement查询,发现传递null参数的结果与在查询本身中定义“isnull”不同

例如,此查询:

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();
与此查询不同:

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为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)
是用来将空数据值插入数据库的

如果要在sql查询中搜索
NULL
数据值,则应使用
IS NULL


毕竟,执行
col2=NULL
也行不通,因为您无法使用
=

来比较
NULL
值。如果您确实在使用Oracle数据库,则可以使用此语句,它还将接受NULL等于NULL:

select col1 from tbl where decode(col2, ?, 1, 0)=1
不是很可读,但比上面的表达式更好。此外,还可以避免对准备好的语句赋予相同的值两次。
我可以在Oracle 11或12上使用。

有没有办法在一条SQL语句中有条件地表达这一点?您的意思是,如何使它在Oracle和另一个数据库中工作,而不必更改SQL语句,或者如何编写一条语句来查找空值或非空值?如何编写一条语句来根据参数输入查找空值或非空值。添加“WHERE col2=?OR(col2为NULL且?为NULL)”似乎是最明智的选择,要求我提供两次变量比定义和维护两个单独的查询更可取。有更好的选择吗?@peterporter:这可能是“最好的”单一SQL。但是您应该在Java中拆分这两种情况,并发出单独的SQL以获得更好的性能(因为访问路径将根据您是否希望为NULL而有所不同)。@Thilo我很感谢您的建议。但是,在这种情况下,我相信未来的开发人员更有可能不正确地更新这两个查询,而不是显著地影响性能。当然,在其他情况下,性能与维护之间的权衡也是可取的。如果我想在一种情况下搜索NULL值,或者在另一种情况下搜索非NULL值,但我想基于输入参数进行搜索,该怎么办?使用if-else语句。如果(value==null){//使用此SQL查询}否则{//使用另一个SQL查询}我试图避免多次定义查询,因为它是一个更复杂的查询,重新定义它将增加未来维护的麻烦。按照“WHERE col2=?OR(col2为NULL且?为NULL)”的思路向查询添加逻辑应该可以解决这个问题。我似乎找不到比详细的答案更简洁的解决方法,即“WHERE col2=?OR(col2为NULL且?为NULL)”。