我有一个表,里面有一些记录。我必须在 2 个日期之间或给定日期之后/之前过滤这些记录,或者如果没有传递日期,则根本不过滤。日期按服务器路由有效负载而来。查询是这样的:
select * from table where "id"=4 and (s2."createdAt" >= date("createdAt") and s2."createdAt" <= date("createdAt"))
在这里,可以给出第一个createdAt
,或者给出第二个,或者根本没有,如果查询没有 and 子句,将在"id"=4
完成。我正在使用续集来编写原始查询和JavaScript/NodeJS来实现。这是代码:
query = await sequelize.query(`select * from "Stores" s2 where "Id" = ${user.id} and (s2."createdAt" >='${param.fromDate}' and s2."createdAt <='${param.toDate}') group by date("createdAt")`);
目前,我正在编写 4 个不同的 if/else 案例,分别根据日期的可用性进行 4 个不同的查询。如何通过仅定义一个查询并附加日期(如果可用(来使其动态化?
你可以做:
where
id = :user.id
and (:param_from_date is null or s2."createdAt" >= :param_from_date)
and (:param_to_date is null or s2."createdAt" <= :param_to_date)
这可以缩短为:
where
id = :user_id
and s2."createdAt" >= coalesce(:param_from_date, s2."createdAt")
and s2."createdAt" <= coalesce(:param_to_date, s2."createdAt")
请注意,这些表达式使用查询参数,而不是修改查询字符串中的值。您确实希望使用参数化查询来保护查询免受 SQL 注入的影响,并使其更高效。