如何在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
相关产品推荐
相关产品推荐

