WHERE子句中的PreparedStatement和'null'值

时间:2012-04-03 15:34:38

标签: jdbc

我正在使用PrepareStatement和BatchUpdate来执行UPDATE查询。在for循环中,我创建了一个Batch。在循环结束时,我执行批处理。

如果在PrepareStatement中使用的SQL查询在WHERE条目中没有空值,则上述逻辑可以正常工作。

如果WHERE clasue中存在空值,则

Update语句失败。

我的代码看起来像这样,

connection = getConnection();

PreparedStatement ps = connection.prepareStatement(
        "UPDATE TEST_TABLE SET Col1 = true WHERE Col2 = ? AND Col3 = ?");

for (Data aa : InComingData){
    if(null == aa.getCol2()){
        ps.setNull(1, java.sql.Types.INTEGER);
    }
    else {
        ps.setInteger(1,aa.getCol2())
    }

    if(null == aa.getCol3()) {
        ps.setNull(2, java.sql.Types.INTEGER);
    }
    else {
        ps.setInteger(2,aa.getCol3())

    }
    ps.addBatch();
}

ps.executeBatch();
connection.commit();    

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

如果您不希望动态生成SQL,可以在NVL子句中的所有可空列上使用WHEREnull转换为列永远不会包含的某个值;在Statement中设置绑定变量时,只需将null转换为NVL函数中使用的相同值即可。例如,

String sql = "UPDATE TEST_TABLE SET Col1 = true
              WHERE NVL(Col2, -1) = ? AND NVL(Col3, -1) = ?";

Statement

ps.setInt(1, aa.getCol2() == null ? -1 : aa.getCol2().intValue());
ps.setInt(2, aa.getCol3() == null ? -1 : aa.getCol3().intValue());

答案 1 :(得分:2)

这是因为在SQL中,something = null始终为false,即使something为空。要将列与null进行比较,您必须使用where col2 is null,而不是where col2 = null