MySQL SELECT WHERE..AND(基于参数值)


@Query(value =
"SELECT * " +
"WHERE (type REGEXP ?1) " +
"AND status= ?2 " +
"AND date(createdAt)..." +
"ORDER BY id DESC " +
"LIMIT ?4",
nativeQuery = true)
Optional<List<Item>> findLatest(String type, String status, String date, int limit);

只有当参数中的date值不为空时,我才希望通过createdAt筛选此查询。

如果是String date = null,则查询不应考虑AND date(createdAt)...

但是,如果String date = "today",则查询应该包括类似AND date(createdAt) = CURRENT_DATE的内容

我怎样才能做到这一点?

简化您可以制作

如果你有更多的选择,你需要时的情况

这个想法是,当条件不满足时,我们让和部分始终为真使得如果所有其他条件都满足,则其中calsue为真

SELECT * FROM
A
WHERE
status= 72 
AND IF( date = "today" , date(createdAt), current_date) = current_date

我们通常处理此问题的方法是向允许空日期的WHERE子句添加逻辑检查。

@Query(value = "SELECT * " +
// ...
"WHERE (type REGEXP ?1) AND " +
"      status = ?2      AND " +
"      (DATE(createdAt) = ?3 OR ?3 IS NULL) " +
"ORDER BY id DESC " +
nativeQuery = true)
Optional<List<Item>> findLatest(String type, String status, String date);

请注意,不可能将参数绑定到LIMIT子句,因此我删除了它。相反,您应该使用Spring的分页API。

最新更新