javascript - Postgres/Sequelize - 有条件地在查询中附加子句

标签 javascript node.js postgresql typescript sequelize.js

我有一个有一些记录的表。我必须在两个日期之间或给定日期之后/之前过滤这些记录,或者如果没有日期通过,则根本不过滤。日期来自服务器路由有效负载。查询是这样的:

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/

相关文章:

javascript - 在 moment.js 中以 ISO 日期格式将时间部分设置为 0

javascript - 如何根据数组中的项目显示 Accordion 组

javascript - 将鼠标单击处理程序分配给具有捕捉行为的 d3 中的行

javascript - Grunt glob——我们可以只复制更改的内容并保留文件结构吗?

javascript - 如何在 Node js 上链接可变数量的方法?

postgresql - 检索相关数据行 : subquery, 或使用 GROUP BY 单独查询的最有效方法?

python - 在不同的机器上安装带有数据库服务器的 openerp 7

ruby-on-rails - rails/Postgres : column must appear in the GROUP BY clause

javascript - 循环 API 的好方法是什么?

node.js - 在 MongoDB 和 Node.js 中获取字段的所有值的最有效方法