Проверьте, существует ли число с диапазоном в БД

0

Мне нужно найти эффективный способ узнать, если диапазон номеров, предоставленный пользователем, уже присутствует в диапазонах, доступных в БД. В таблице чисел в БД есть два столбца: Начальный номер и Конечный номер

Предположим, что существует диапазон, в котором стартовый номер равен: 102 и Ending number равен 122, тогда начало следующего диапазона будет: 123 или может быть от 1 до 101

Например, значения столбцов таблицы "Два диапазона" следующие:

Начальный номер | Конечный номер

Изображение 174551

Поэтому, если пользователь пытается создать новый диапазон, скажем, от 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;

Есть ли способ, которым я могу заставить это последнее условие работать так же хорошо?

  • 1
    использовать тег DB, вы имели в виду базу данных, использующую SQL?
  • 0
    Эти вещи обычно делаются непосредственно в базе данных, а не в вашем коде Java.
Показать ещё 12 комментариев
Теги:

3 ответа

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);
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, значит, этот диапазон существует, и ваш код не должен позволять входы хранить в БД.

1

Предлагаемый новый диапазон A..B недоступен, если выполнено одно из следующих утверждений (которое может тестироваться в SQL-запросе):

  • Существует запись БД, где SN <= A и EN => A (существующий диапазон охватывает, по крайней мере, нижний конец предлагаемого)
  • Существует запись БД, где SN <= B и EN> = B (существующий диапазон охватывает, по крайней мере, верхний конец предлагаемого)
  • Существует запись БД, где SN <= A и B <= EN (существующий диапазон находится в пределах предлагаемого)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню