Мне нужно найти эффективный способ узнать, если диапазон номеров, предоставленный пользователем, уже присутствует в диапазонах, доступных в БД. В таблице чисел в БД есть два столбца: Начальный номер и Конечный номер
Предположим, что существует диапазон, в котором стартовый номер равен: 102 и Ending number равен 122, тогда начало следующего диапазона будет: 123 или может быть от 1 до 101
Например, значения столбцов таблицы "Два диапазона" следующие:
Начальный номер | Конечный номер
Поэтому, если пользователь пытается создать новый диапазон, скажем, от 190 до 220 или от 85 до 105, он должен получить ошибку, поскольку цифры в этом диапазоне уже существуют в диапазонах в БД.
Так, согласно моему примеру выше, пользователю всегда должно быть позволено создавать диапазон за пределами 1700, например, с 1701 по 1750, или что-либо из недостающих диапазонов: от 251 до 299 или от 1251 до 1299.
Я смог решить большинство сценариев, используя этот запрос ниже, но один сценарий, который я не мог получить:
//Для промежутков между доступными диапазонами (Возвращает нет значения: работает правильно)
select * from range
where 121 BETWEEN StartingNumber and EndingNumber
or 149 BETWEEN StartingNumber and EndingNumber;
//Для внешних диапазонов (Returns no value: работает корректно)
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;
Есть ли способ, которым я могу заставить это последнее условие работать так же хорошо?
Я смог решить это, используя этот запрос ниже, он заботится обо всех четырех сценариях, упомянутых выше:
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);
Вам не нужно брать все строки, чтобы найти диапазон. Всего четыре вопроса в соответствии с условиями вашего вопроса.
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, значит, этот диапазон существует, и ваш код не должен позволять входы хранить в БД.
Предлагаемый новый диапазон A..B недоступен, если выполнено одно из следующих утверждений (которое может тестироваться в SQL-запросе):