java - Spring namedParameterJdbcTemplate 和一个列表参数 : how to check if it is null in SQL?

标签 java sql spring

我正在使用 spring 的 NamedParameterJdbcTemplate,因为我的 SQL 查询中有一个 SELECT ... IN (),如 here 所述.

在我们的具体案例中,业务逻辑应该是: - 如果要检查的 id 列表为 null 或为空,则忽略整个 IN 条件 - 如果列表包含 id,则像平常一样使用 IN 条件

所以我们这样编程:

SELECT * FROM table WHERE (:ids IS NULL or table.column IN (:ids))

如果 :ids 确实是 NULL 或空列表,则此查询有效,但如果不是,则查询失败,因为 spring 为 3 个值的列表填充参数的方式是这样的:

SELECT * FROM table WHERE ((?,?,?) IS NULL or table.column IN (?,?,?))

并且您不能对三重问号语句执行“IS NULL”。有什么简单的方法可以直接在 SQL 查询中解决这个问题,而不是使用 Java 代码(我们不想在 Java 中的 sql 查询中进行字符串操作)?

最佳答案

你可以尝试像这样颠倒顺序:

SELECT * FROM table WHERE (table.column IN (:ids) or :ids IS NULL)

由于您的 3 id 案例将满足第一个条件,因此可能不会评估“或”。不过,这可能取决于您的数据库。这适用于 Hibernate + Oracle,但我没有看到它适用于 Sybase IQ + NamedParameterJdbcTemplate,因此您的里程可能会有所不同。

如果您的数据库支持公用表表达式 (CTE),您可以试试这个:

with 
x as   (
       select column
       from   table
       where  column in (:ids)
       )
select *
from   table
where  (table.column in (:ids) or (select count(*) from x) = 0)

关于java - Spring namedParameterJdbcTemplate 和一个列表参数 : how to check if it is null in SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49157792/

相关文章:

java - 如何在没有 web.xml 的情况下将 tomcat 与 spring 一起使用?

java - JPA 中的引用完整性约束违规错误

java - 使用 Java EE 保留我的第一个实体

java - 更新recyclerView

sql - hierarchyid适合频繁插入叶子节点的大树吗?

sql - Postgres 跨表唯一组合约束

Java - 图形 - 在 JPanel 上添加另一个形状

sql - "Incorrect syntax near the keyword ' WHERE '"在 SQL Server 中的 from 子句

java - 自注入(inject)原型(prototype)bean - 循环引用

spring - 覆盖基于Java的Spring Context配置以进行测试