繁体   English   中英

Spring namedParameterJdbcTemplate 和一个列表参数:如何在 SQL 中检查它是否为空?

[英]Spring namedParameterJdbcTemplate and a list parameter: how to check if it is null in SQL?

我使用Spring的是NamedParameterJdbcTemplate,因为我在SQL查询中有一个SELECT ... IN(),作为解释在这里

在我们的具体案例中,业务逻辑应该是: - 如果要检查的 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM