[英]How to pass interval parameter into sql request using namedparameterjdbctemplate java
[英]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.