PreparedStatement 和 WHERE 子句中的“null”值

问题描述 投票:0回答:3

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

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

如果 WHERE 子句中存在空值,则更新语句失败。

我的代码看起来像这样,

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();    

如有任何帮助,我们将不胜感激。

jdbc
3个回答
4
投票

如果您不希望动态生成 SQL,您可以在

NVL
子句中的所有可空列上使用
WHERE
null
转换为该列永远不会包含的某个值;在
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());

2
投票

那是因为在 SQL 中,

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


0
投票

尝试使用:


PreparedStatement ps = connection.prepareStatement(
        "SELECT * FROM some_table WHERE ((1=? and maybe_null is null) OR (2=? and maybe_null = ?))");
if (maybeNull == null){
    ps.setInt(1, 1); // active left
    ps.setInt(2, 1); // inactive right
    ps.setString(3, '');  // any val
}else{
    ps.setInt(1, 2); // inactive left
    ps.setInt(2, 2); // active right
    ps.setString(3, 'some_value');  // THE VAL
}
© www.soinside.com 2019 - 2024. All rights reserved.