SQL/Sequelize实现多列匹配返回famid与非匹配列值的无存储过程查询方法
简洁实现方案
实现思路
这个需求本质就是从双列里挑出不是目标值的那个,完全没必要写复杂逻辑,单表就能搞定:
- 第一步先把所有和目标X沾边的家庭记录筛出来,把那些完全不包含X的无关记录(比如示例里的famid=2,两个indiv是33和22,根本没42)直接排除
- 第二步对筛出来的每条记录,判断哪一列存的是X,就把另一列的值取出来当最终的indiv返回
通用SQL写法
所有关系型数据库都能跑,拿X=42举例子:
SELECT famid, CASE WHEN indiv1 = 42 THEN indiv2 WHEN indiv2 = 42 THEN indiv1 END AS indiv FROM Family WHERE indiv1 = 42 OR indiv2 = 42
跑完的结果和预期完全对得上:
| famid | indiv |
|---|---|
| 1 | 27 |
| 3 | 12 |
| 4 | 22 |
| 5 | 27 |
小提醒:如果业务里可能出现indiv1和indiv2都是X的脏数据,记得在CASE最后加个
ELSE NULL兜底,别返回没意义的值。只要给indiv1、indiv2列建上普通索引,这个查询的性能完全没问题,不需要额外优化。
Sequelize 实现
不用拼复杂的原生SQL,用Sequelize自带的literal就能拼出对应逻辑,还能自动处理参数转义:
const X = 42; const result = await Family.findAll({ attributes: [ 'famid', [ sequelize.literal(`CASE WHEN indiv1 = ${X} THEN indiv2 WHEN indiv2 = ${X} THEN indiv1 END`), 'indiv' ] ], where: { [Op.or]: [ { indiv1: X }, { indiv2: X } ] }, raw: true })
拿到的结果转成需要的二维数组格式就行,整个逻辑没有存储过程、没有复杂关联,写起来也简洁。
内容的提问来源于stack exchange,提问作者lucas_dev
相关产品推荐
相关产品推荐

