如何编写SQL查询获取与指定值区间存在重叠的表记录?
问题分析
你之前的两种写法漏了记录区间完全包含查询区间的场景:sno=4的区间是[2001,2010],整个覆盖了目标查询区间[2002,2004],所以没有被匹配到。
- 第一种写法仅判断记录的起始或结束值落在查询区间内,无法匹配到起止值都在查询区间外、但整体包住查询区间的记录
- 第二种写法要求记录的整个区间完全落在查询区间内,也会漏掉大范围覆盖目标区间的记录
区间重叠判断逻辑
如果要匹配所有和[2002,2004]存在交集的记录,通用判断条件为:
记录的起始值 ≤ 查询区间的结束值 且 记录的结束值 ≥ 查询区间的起始值
对应到你的场景就是 fromvalue <= 2004 AND tovalue >= 2002
正确SQL语句
SELECT * FROM demo4 WHERE fromvalue <= 2004 AND tovalue >= 2002;
验证结果
执行上述语句后返回的行如下:
| sno | fromvalue | tovalue |
|---|---|---|
| 1 | 2002 | 2002 |
| 2 | 2003 | 2003 |
| 3 | 2004 | 2004 |
| 4 | 2001 | 2010 |
完全符合需求。
内容的提问来源于stack exchange,提问作者user11840889
相关产品推荐
相关产品推荐

