You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Spring JDBC在PostgreSQL中批量删除含Null条件的数据行

用单条SQL实现PostgreSQL批量删除(含Null值匹配)

可以用单条SQL实现批量删除,完全不需要将集合拆分为含Null和不含Null的两类处理,推荐两种高效实现方式:

方式1:利用IS NOT DISTINCT FROM操作符(批量执行单条SQL)

PostgreSQL的IS NOT DISTINCT FROM操作符会自动处理Null值的匹配逻辑——当两边都是Null时视为相等,非Null时等价于普通的=。直接用这个操作符替代分支判断的逻辑,结合NamedParameterJdbcTemplate的批量更新方法即可:

// 统一的SQL语句,无需分支
val sql = """
    DELETE FROM some_table 
    WHERE some_column = :someValue 
      AND some_other_column IS NOT DISTINCT FROM :someOtherValue
"""

// 构造批量参数列表,直接传入含Null的原始集合
val params = inputCollection.map { item ->
    mapOf(
        "someValue" to item.someValue,
        "someOtherValue" to item.someOtherValue
    )
}

// 执行批量删除
namedParameterJdbcTemplate.batchUpdate(sql, params.toTypedArray())

方式2:利用行构造器的IN子句(一次性删除)

如果希望只发送一次SQL请求完成所有删除,可以用PostgreSQL支持的行比较语法,将多个(值, 可能为Null的值)对作为参数传入:

// 单条SQL一次性删除所有匹配行
val sql = """
    DELETE FROM some_table 
    WHERE (some_column, some_other_column) IN (:pairs)
"""

// 构造行参数集合,每个元素是包含两个值的数组(支持Null)
val pairs = inputCollection.map { item ->
    arrayOf(item.someValue, item.someOtherValue)
}

// 执行删除
namedParameterJdbcTemplate.update(sql, mapOf("pairs" to pairs))

原理说明

两种方式都规避了分支判断:

  • IS NOT DISTINCT FROM直接覆盖了=和IS NULL两种场景的匹配逻辑
  • 行构造器的IN子句在PostgreSQL中会正确处理包含Null的行匹配(即当行中的某个元素是Null时,只有目标行对应列也是Null才会匹配)

内容的提问来源于stack exchange,提问作者KevinS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 11:41:16