SpringnamedParameterJdbcTemplate和列表参数:如何在SQL中检查它是否为空?

use*_*155 7 java sql spring

我使用 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 查询中进行字符串操作)?

spl*_*out 0

您可以尝试颠倒顺序,如下所示:

SELECT * FROM table WHERE (table.column IN (:ids) or :ids IS NULL)
Run Code Online (Sandbox Code Playgroud)

由于您的 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)
Run Code Online (Sandbox Code Playgroud)