我有一个有一些记录的表。我必须在两个日期之间或给定日期之后/之前过滤这些记录,或者如果没有日期通过,则根本不过滤。日期来自服务器路由有效负载。查询是这样的:
select * from table where "id"=4 and (s2."createdAt" >= date("createdAt") and s2."createdAt" <= date("createdAt"))
在这里,要么先
createdAt
如果查询没有 and 子句并且将在 "id"=4
处完成,则可以给出,或者第二个,或者根本没有给出。 .我正在使用 sequelize 编写原始查询和 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 注入(inject)并提高它们的效率。
关于javascript - Postgres/Sequelize - 有条件地在查询中附加子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59879608/