Sequelize构建含AND/OR的动态where子句结果不符合预期如何解决
问题根因
你当前的写法将active条件和每个动态生成的条件都作为独立项放入了Op.and数组,导致所有动态条件之间默认是AND关联,和你需要的OR关联逻辑不符。
调整后代码
// 单独收集所有动态生成的OR条件 const dynamicConditions = []; for (let i = 0; i < dynamicList.length; i++) { dynamicConditions.push({ [Op.or]: [ { hierarchy: { [Op.like]: `%${dynamicList[i]}%` } }, { id: dynamicList[i] } ] }); } const condition = { where: { [Op.and]: [ { active: 'true' }, // 所有动态条件整体用OR拼接 { [Op.or]: dynamicConditions } ] }, attributes: [Sequelize.fn('DISTINCT', Sequelize.col('name'))], }; db.tableName .findAll(condition) .then((result) => callback(null, result)) .catch((err) => callback(err, null));
生成SQL说明
上述代码会生成符合你描述的active=true AND (动态条件1 OR 动态条件2)逻辑的SQL:
SELECT DISTINCT(name) FROM tableName AS tableName WHERE ( tableName.active = 'true' AND ( (tableName.hierarchy LIKE '%111%' OR tableName.id = '111') OR (tableName.hierarchy LIKE '%222%' OR tableName.id = '222') ) );
注意你贴出的期望SQL存在括号书写错误,实际运算逻辑等价于(active=true AND 条件1) OR 条件2,如果需要该逻辑,只需将外层的Op.and改为Op.or即可。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

