如何使用 Java NamedParameterJdbcTemplate 查询潜在的空值

Rob*_*tts 3 java sql

这是我如何使用 a 的示例NamedParameterJdbcTemplate

SqlParameterSource params = new MapSqlParameterSource("column1", value1)
                                            .addValue("column2", value2)
                                            .addValue("column3", value3);
List<String> values = namedParameterJdbcTemplate.query("SELECT column4 FROM my_table WHERE column1=:column1 and column2=:column2 and column3=:column3", params, (rs, numRow) -> {
    return rs.getString("column4");
});
Run Code Online (Sandbox Code Playgroud)

这通常工作得很好,但我有一个value2可以为空的情况。然后它不起作用,因为无法正常比较 null

我如何namedParameterJdbcTemplate处理我正在寻找空值的情况?

需要明确的是,要使 SQL 查询正确,它需要评估为WHERE ... and column2 is null ...而不是 WHERE ... and column2=null.

Tom*_*m H 5

尝试使用:

SELECT
    column4
FROM
    my_table
WHERE
    (column1=:column1 OR (column1 IS NULL AND :column1 IS NULL)) and
    (column2=:column2 OR (column2 IS NULL AND :column2 IS NULL)) and
    (column3=:column3 OR (column3 IS NULL AND :column3 IS NULL))
Run Code Online (Sandbox Code Playgroud)

或者,您可以尝试使用COALESCE

COALESCE(column1, '') = COALESCE(:column1, '')
Run Code Online (Sandbox Code Playgroud)

那是假设您想将空字符串与NULL. 此外,这将排除在 上使用任何索引column1,因此请注意这一点。

您还可以尝试根据 :column1、2 和 3 的值更改查询字符串 - 将其调整为使用=IS NULL适当。