仅当值不为null时才使用SQL

仅当值不为null时才使用SQL,sql,postgresql,spring-boot,jpa,Sql,Postgresql,Spring Boot,Jpa,我正在使用Postgres。类似以下内容的筛选器查询: SELECT * FROM Entity E WHERE E.field1 = ? AND E.field2 = ? AND E.field3 = ? AND E.field4 = IN (?field4[]) ?字段1和?字段2是必填字段,因此它们将始终存在字段3和字段4是可选的。只有当?field3和?field4[]的值存在时,我才想使用和E.field3=?&和E.field4=IN(?field4[]),否则忽略您可以在wher

我正在使用Postgres。类似以下内容的筛选器查询:

SELECT * FROM Entity E
WHERE E.field1 = ?
AND E.field2 = ?
AND E.field3 = ?
AND E.field4 = IN (?field4[])

?字段1
?字段2
是必填字段,因此它们将始终存在<代码>字段3和字段4是可选的。只有当
?field3
?field4[]的值存在时,我才想使用
和E.field3=?
&
和E.field4=IN(?field4[])
,否则忽略
您可以在
where
子句中使用
case
语句,如下所示

SELECT * FROM Entity E
WHERE 
CASE WHEN E.field3 IS NOT NULL and E.field4 IS NOT NULL THEN
E.field1 = ?
AND E.field2 = ?
AND E.field3 = ?
AND E.field4 IN (?field4[])
ELSE
E.field1 = ?
AND E.field2 = ?
END 


当字段3和字段4没有任何值时,请传递一些值,如“default_val”,然后尝试此操作-
SELECT*FROM Entity E,其中E.field1=?和E.field2=?和(E.field3=?或E.field3='默认值')和(E.field4=IN(?field4[])或E.field4='默认值')
您可以使用
JpaSpecificationExecutor
存储库方法
findAll(规范规范规范,可分页)
。此解决方案允许您使用相同的存储库和服务API扩展参数列表。我在这里回答了一个类似的问题NULL,NOT NULL我必须对我传递的参数应用这些检查,而不是对现有列值应用这些检查是否要检查参数或列的值?如果要将其与正在传递的值进行比较,则在
情况下,只要将
E.field3
替换为
?field3
,将
E.field4
替换为
?field4