4

我正在针对 Oracle 11g 数据库处理 JDBC 中的 PreparedStatement 查询,发现传递空参数的结果与在查询本身中定义“为空”不同。

例如,这个查询:

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”两种情况。

4

3 回答 3

6

这与 Java 无关,实际上,这就是 NULL 在 Oracle 中的工作方式。

与任何事物(甚至与 NULL)相比,NULL 始终为 false,您必须使用 IS NULL。

这也将不返回任何行:

SELECT col1 FROM tbl WHERE col2 = NULL

甚至

SELECT col1 FROM tbl WHERE NULL = NULL
于 2012-06-12T05:02:00.767 回答
3

我相信这ps.setNull(1, java.sql.Types.INTEGER)是为了NULL 数据值插入数据库。

IS NULL如果您在 sql 查询中搜索NULL数据值,您应该使用。

毕竟,doingcol2 = NULL也行不通,因为您无法NULL使用以下方法比较值=

于 2012-06-12T05:03:43.693 回答
0

如果您确定使用 Oracle 数据库,那么您可以使用此语句,它还将接受 NULL 等于 NULL:

select col1 from tbl where decode(col2, ?, 1, 0)=1

不是很可读,但比上面的表达式更好。此外,您避免为准备好的语句提供两次相同的值。在 Oracle 11 或 12 上为我工作。

于 2020-03-10T09:41:39.743 回答