我需要找到一种有效的方法来找出用户提供的数字范围是否已存在于DB中可用的范围内。数据库中的数字表中有两列:起始编号和结束编号
假设存在一个范围,其中起始编号为:102,结束编号为122,则下一个范围的起点为:123或者可以是介于1到101之间的任何位置
例如,两个Range表列的值如下:
起始编号|结束号
因此,如果用户尝试创建一个新范围,例如: 190到220 或 85到105 ,他应该会收到错误,因为此范围内的数字已经存在在DB的范围内。
因此,根据上面的示例,应始终允许用户创建超出 1700 1701 至 1750 或任何其他内容的范围缺少范围说从 251到299 或从 1251到1299 。
我能够使用下面的查询解决大多数情况,但有一种情况我无法开始工作:
//适用于可用的范围之间(不返回值:正常工作)
select * from range
where 121 BETWEEN StartingNumber and EndingNumber
or 149 BETWEEN StartingNumber and EndingNumber;
//对于外部范围(不返回值:正常工作)
select * from range
where 1701 BETWEEN StartingNumber and EndingNumber
or 1800 BETWEEN StartingNumber and EndingNumber;
//对于重叠范围(返回行,因此无法创建此范围:正常工作)
select * from range
where 150 BETWEEN StartingNumber and EndingNumber
or 160 BETWEEN StartingNumber and EndingNumber;
//但是对于690到1800的范围,它会失败,因为它没有返回任何值但已经超过700到1700的范围
select * from range
where 690 BETWEEN StartingNumber and EndingNumber
or 1800 BETWEEN StartingNumber and EndingNumber;
有没有办法可以让这最后一个条件正常工作?
答案 0 :(得分:1)
如果满足以下任何条件(可以在SQL查询中测试),则建议的新范围A..B不可用:
答案 1 :(得分:1)
您无需获取所有行来查找范围。根据你问题的条件,只需要四次查询。
SELECT COUNT(*) FROM table_name_here WHERE 'InputStartingNumber' <= starting_number_column AND 'InputEndingNumber' >= ending_number_column;
SELECT COUNT(*) FROM table_name_here WHERE 'InputStartingNumber' <= ending_number_column AND 'InputEndingNumber' >= ending_number_column;
SELECT COUNT(*) FROM table_name_here WHERE 'InputStartingNumber' <= starting_number_column AND ending_number_column <= 'InputEndingNumber';
SELECT COUNT(*) FROM table_name_here WHERE 'InputStartingNumber' >= starting_number_column AND 'InputEndingNumber'<= ending_number_column;
如果这些查询中的任何一个返回的计数大于0,则表示该范围存在且您的代码不允许将输入存储在数据库中。
答案 2 :(得分:0)
我能够使用下面的查询来解决这个问题,它会处理上面提到的所有四种情况。:
SELECT count(StartingNumber) FROM range
WHERE 690 BETWEEN StartingNumber and EndingNumber
or 1800 BETWEEN StartingNumber and EndingNumber
or StartingNumber in ( SELECT StartingNumber
FROM range
WHERE StartingNumber BETWEEN 690 AND 1800);