Я сделал эксперимент с таблицей, имеющей столбец 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);
}
}