我做了一个带有VARCHAR列的表的实验,该列具有空值,试图获取具有特定列NULL的行数。我用了三种形式:
表单A
SELECT COUNT(*) FROM buyers WHERE buye_resp IS NULL
表格B
SELECT COUNT(*) FROM buyers WHERE buye_resp = ?
...其中参数随 setString(1,null)
提供表格C
...比如表格B ,但参数设置为 setNull(1,java.sql.Types.VARCHAR)
在三种形式中,只有形式A 产生了正确的结果,形式B和C都返回0(帖子末尾的三种形式的代码)。这引出了一个问题: setNull 的目的是什么?
针对PostgreSQL 9.2数据库运行的测试。
private static int numOfRows_formA(Connection conn) throws SQLException {
PreparedStatement pstm = null;
ResultSet rs = null;
try {
String pstmStr = "SELECT COUNT(*) FROM buyers WHERE buye_resp IS NULL";
pstm = conn.prepareStatement(pstmStr);
rs = pstm.executeQuery();
rs.next();
return rs.getInt(1);
} finally {
DbUtils.closeQuietly(null, pstm, rs);
}
}
private static int numOfRows_formB(Connection conn) throws SQLException {
PreparedStatement pstm = null;
ResultSet rs = null;
try {
String pstmStr = "SELECT COUNT(*) FROM buyers WHERE buye_resp = ?";
pstm = conn.prepareStatement(pstmStr);
pstm.setString(1, null);
rs = pstm.executeQuery();
rs.next();
return rs.getInt(1);
} finally {
DbUtils.closeQuietly(null, pstm, rs);
}
}
private static int numOfRows_formC(Connection conn) throws SQLException {
PreparedStatement pstm = null;
ResultSet rs = null;
try {
String pstmStr = "SELECT COUNT(*) FROM buyers WHERE buye_resp = ?";
pstm = conn.prepareStatement(pstmStr);
pstm.setNull(1, java.sql.Types.VARCHAR);
rs = pstm.executeQuery();
rs.next();
return rs.getInt(1);
} finally {
DbUtils.closeQuietly(null, pstm, rs);
}
}
答案 0 :(得分:8)
SQL使用ternary logic,因此当buye_responsible = ?
为unknown
时,true
始终返回buye_responsible
(永不null
}。这就是您需要IS NULL
来检查null
。
setNull()
传递给null
和INSERT
语句时,可以使用 UPDATE
。由于setInt()
和setLong()
等方法采用原始类型(int
,long
),因此在这种情况下需要使用特殊方法传递null
。
答案 1 :(得分:1)
在数据库系统中,null不等于另一个null
第SELECT COUNT(*) FROM vat_refund.er_buyers WHERE buye_responsible = null
行不会返回任何记录。 setNull()方法只是在索引位置设置一个null。Sets the designated parameter to SQL NULL.
来自JAVA API。也就是说,它会为该索引设置一个SQL null,但它不会根据您的需要使用isNull()函数。
所以这就是为什么表格C也没有得到任何结果。