检查是否存在数据范围为

时间:2018-04-16 14:40:33

标签: mysql sql

我需要找到一种有效的方法来找出用户提供的数字范围是否已存在于DB中可用的范围内。数据库中的数字表中有两列:起始编号结束编号

假设存在一个范围,其中起始编号为:102,结束编号为122,则下一个范围的起点为:123或者可以是介于1到101之间的任何位置

例如,两个Range表列的值如下:

起始编号|结束号

enter image description here

因此,如果用户尝试创建一个新范围,例如: 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;

有没有办法可以让这最后一个条件正常工作?

3 个答案:

答案 0 :(得分:1)

如果满足以下任何条件(可以在SQL查询中测试),则建议的新范围A..B不可用:

  • 有一个DB记录,其中SN< = A和EN => A (现有范围至少涵盖拟议范围的低端)
  • 有一个DB记录,其中SN< = B和EN> = B (现有范围至少覆盖建议范围的高端)
  • 有一个DB记录,其中SN< = A和B< = EN (现有范围在拟议范围内)

答案 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);