如何用Sequelize实现MySQL多列范围区间查询?
正确实现方式说明
首先明确:你提供的原MySQL语句SELECT * FROM advisor_product_range WHERE 5 BETWEEN from_range AND to_range;,其逻辑等价于from_range <= 5 AND to_range >= 5——也就是你当前Sequelize代码生成的SQL逻辑其实是一致的。如果认为逻辑不符,要么是对表中from_range/to_range的范围定义理解反了(比如from_range是上限、to_range是下限),要么是你希望生成的SQL和原语句完全一致而非仅逻辑等价。
以下是两种符合Sequelize 5.8版本的实现方式:
方式1:用运算符实现逻辑等价(推荐,符合ORM风格)
先导入Sequelize运算符:
const { Op } = require('sequelize');
然后编写查询代码:
AdvisorProductRange.findAll({ where: { from_range: { [Op.lte]: 5 }, to_range: { [Op.gte]: 5 } } });
这段代码生成的SQL和你当前看到的一致,逻辑完全匹配原MySQL语句。
方式2:用literal生成完全相同的SQL
如果希望生成的SQL和原语句一字不差,可以直接嵌入原生SQL片段:
AdvisorProductRange.findAll({ where: sequelize.literal('5 BETWEEN from_range AND to_range') });
此方式会直接生成WHERE 5 BETWEEN from_range AND to_range的条件,和原MySQL语句完全一致。
若你确实认为逻辑不符,请检查表结构中from_range和to_range的定义,确认哪个是范围的最小值/最大值,再调整运算符(比如若from_range是最大值,就把Op.lte换成Op.gte,Op.gte换成Op.lte)。
内容的提问来源于stack exchange,提问作者saurabh kamble
相关产品推荐
相关产品推荐

