【发布时间】:2013-04-10 04:35:41
【问题描述】:
我对具有空值的 VARCHAR 列的表进行了实验,试图获取具有特定列 NULL 的行数。我用了三种形式:
表格A
SELECT COUNT(*) FROM buyers WHERE buye_resp IS NULL
表格 B
SELECT COUNT(*) FROM buyers WHERE buye_resp = ?
... 参数由 setString(1, null)
提供C 型
... 类似于 form 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);
}
}
【问题讨论】:
-
问之前去过那里。不太一样。
标签: java postgresql jdbc