You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Sequelize模型中用CASE WHEN实现聚合查询替代原生SQL?

如何用Sequelize模型替代原生SQL实现CASE WHEN聚合查询

完全可以不用原生sequelize.query()来实现这个查询!你之前尝试用sequelize.fn()的方向是对的,但CASE WHEN这类条件逻辑需要结合sequelize.literal()来嵌入到聚合函数里——因为Sequelize的fn()主要用来调用数据库内置函数,没法直接解析CASE语法。

下面就是你想要的基于OpenIncident模型的完整实现代码:

return OpenIncident.findAll({
  attributes: [
    'queue',
    [sequelize.fn('COUNT', sequelize.col('id')), 'total'],
    [sequelize.fn('SUM', sequelize.literal(`CASE WHEN type = 'Proactive' THEN 1 ELSE 0 END`)), 'proactive'],
    [sequelize.fn('SUM', sequelize.literal(`CASE WHEN type = 'Reactive' THEN 1 ELSE 0 END`)), 'reactive']
  ],
  group: ['queue'],
  order: [['total', 'DESC']]
})
.then(queues => res.json(queues))
.catch(err => res.status(400).json(err));

代码说明:

  • sequelize.literal()的作用是直接将传入的SQL片段原样插入到生成的查询语句中,完美适配CASE WHEN这类自定义条件逻辑
  • 排序时直接使用别名'total'即可,无需重复编写COUNT函数,代码更简洁
  • 这种写法完全贴合Sequelize的ORM风格,相比原生查询,能更好地利用模型的类型校验、关联查询等特性

内容的提问来源于stack exchange,提问作者Sohan Dutta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:46:24