首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDBC setNull()与Oracle "is null“产生不同的结果

JDBC setNull()与Oracle "is null“产生不同的结果
EN

Stack Overflow用户
提问于 2012-06-12 12:58:48
回答 2查看 5.4K关注 0票数 4

我正在使用JDBC对Oracle11g数据库执行PreparedStatement查询,发现传递null参数的结果与在查询本身中定义"is null“的结果不同。

例如,这个查询:

代码语言:javascript
复制
String sql = "SELECT col1 FROM tbl WHERE col2 = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setNull(1, java.sql.Types.INTEGER);
ps.execute();

与以下查询不同:

代码语言:javascript
复制
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”两种情况。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-12 13:02:01

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

当与任何东西(甚至是NULL)进行比较时,NULL总是假的,您必须使用is NULL。

这也将不返回任何行:

代码语言:javascript
复制
SELECT col1 FROM tbl WHERE col2 = NULL

甚至是

代码语言:javascript
复制
SELECT col1 FROM tbl WHERE NULL = NULL
票数 6
EN

Stack Overflow用户

发布于 2020-03-10 17:41:40

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

代码语言:javascript
复制
select col1 from tbl where decode(col2, ?, 1, 0)=1

可读性不是很好,但比上面的表达式要好。此外,还可以避免将相同的值两次赋给准备好的语句。适用于我在Oracle 11或12上的工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10990749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档