10

我对具有空值的 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);
    }
}
4

2 回答 2

9

SQL 使用三元逻辑,因此当is时buye_responsible = ?总是返回unknown(并且从不true)。这就是为什么您需要检查.buye_responsiblenullIS NULLnull

setNull()例如,当您需要将nulls 传递给INSERTandUPDATE语句时,可以使用它。由于setInt()和之类的方法setLong()采用原始类型(int, ),因此在这种情况下long您需要一个特殊的方法来传递。null

于 2013-04-17T12:17:47.253 回答
1

在数据库系统中,一个空值不等于另一个空值,因此该行SELECT COUNT(*) FROM vat_refund.er_buyers WHERE buye_responsible = null不会返回任何记录。setNull() 方法只是在索引位置设置一个空值。Sets the designated parameter to SQL NULL.这来自 JAVA API。也就是说,它将为该索引设置一个 SQL null,但它不会按照您的需要使用 isNull() 函数。所以这就是为什么对于表格 C 你也​​没有得到任何结果。

于 2013-04-17T12:20:25.873 回答