如何在本机查询中使用 NVL 或 COALESCE 获取 Spring Data JPA 中的值列表

Posted

技术标签:

【中文标题】如何在本机查询中使用 NVL 或 COALESCE 获取 Spring Data JPA 中的值列表【英文标题】:How to use NVL or COALESCE in native query for list of values in Spring Data JPA 【发布时间】:2022-01-16 17:24:35 【问题描述】:

我正在使用如下本机查询,它从多个表中获取数据。 我还想根据用户输入对其进行过滤。用户可以在过滤器菜单中选择无、一个或多个复选框,我的查询应根据这些复选框返回记录。 我已经尝试了两种方法,例如:

src_region.region_id NVL(:regionIds,src_region.region_id )
src_region.region_id in(:regionIds) OR COALESCE (:regionIds)IS NULL)

但是对于他们来说,我在发送列表值时都遇到了错误。

public interface dbRepository

  public static final String dbQuery = "select * from
    (select src_data.*,
            trg_data.*
    from
    (select reg.region_id,reg.region_name,
            ctry.country_id,ctry.country_name
    from src_region reg,src_ctry ctry
    where reg.region_id=ctry.region_id
    AND src_region.region_id in(:regionIds) OR COALESCE (:regionIds)IS NULL) src_data,
    
    (select md.module_id,reg.module_name,
            ctry.country_id,ctry.country_name
    from trg_module md,trg_ctry ctry
    where md.module_id=ctry.country_id
    AND ctry.country_id in(:countryIds) OR COALESCE (:countryIds)IS NULL) trg_data
ORDER BY src_data.region_id ";

  @Query( value = dbQuery, nativeQuery = true )
List<Object[]> findBySorceOrTarget( @Param( "regionIds" ) List<Long> regionIds, @Param( "countryIds" ) List<Long> countryIds );


用户可能无法发送值。此外,它们也可以只发送一个值,而不是发送多个值。将值列表传递给本机查询中的参数的更好方法是什么?

【问题讨论】:

【参考方案1】:

一般来说应该是这样

AND (src_region.region_id = :regionIds or :regionIds IS NULL)

但是,如果您可以选择多个值,那么 = 就不行了 - 您必须切换到 in(正如您发布的代码所暗示的那样)。但是,您不能这样做,因为您将得到 nothing 作为结果 - 您必须将这些值拆分为行。

类似这样(假设:regionIds 中的值是逗号分隔的,例如1,2,5

and (src_region.region_id in (select regexp_substr(:regionIds, '[^,]+', 1, level)
                              from dual
                              connect by level <= regexp_count(:regionIds, ',') + 1
                             )
     or :regionIds is null)

【讨论】:

以上是关于如何在本机查询中使用 NVL 或 COALESCE 获取 Spring Data JPA 中的值列表的主要内容,如果未能解决你的问题,请参考以下文章

处理空值,把 Null 值转换为实际值(coalesce,nvl 函数用法)

oracle NVL,NVL2,NULLIF,COALESCE

nvl、nvl2、nullif、coalesce函数的区别

Oracle中nvl函数的用法和作用是啥?

Postgresql使用coalesce实现类似oracle的NVL方法

SQL nvl 等效 - 没有 if/case 语句 & isnull & coalesce