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

标签 java sql

这是我如何使用 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");
});

这通常工作得很好,但我遇到了 value2 可以为 null 的情况。然后它不起作用,因为 null can't be compared normally .

如何让 namedParameterJdbcTemplate 处理我正在寻找 null 的情况?

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

最佳答案

尝试使用:

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

或者,您可以尝试使用 COALESCE:

COALESCE(column1, '') = COALESCE(:column1, '')

这是假设您要将空字符串等同于 NULL。此外,这将阻止在 column1 上使用任何索引,因此请注意这一点。

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

关于java - 如何使用 Java NamedParameterJdbcTemplate 查询潜在的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35733754/

相关文章:

SQL Server更新列比较跨行的值

sql - 创建一个只能在当前连接中访问的(临时?)表

java - 带有欢迎文件的嵌入式 Jetty REST 服务

java - 如何从文件读取器中删除某些值(使用 ArrayList)?

sql - UITableView 中来自 SQLite 的 iOS NSArray 的 NSDictionaries

sql - elasticsearch匹配两个字段

java - Guice - Guice 中的 Spring Autowired 相当于什么

java - 如何在 CardLayout 中显示特定的滚动 Pane ?

java.lang.IllegalArgumentException : Illegal pattern character 'Y' for SimpleDateFormat

sql - 如何获得特定的结果 block ?