Проверьте диапазоны, перекрывающие сторону базы данных с объединением

0

Я не могу понять, как проверить на стороне базы данных, перекрываются ли два диапазона, которые могут обрабатывать нулевые значения (например, диапазон A: ноль - нулевой диапазон B: 3 - 10).

В этом случае эти два диапазона перекрываются, потому что в моем коде нуль-ноль он равен -∞ и + ∞, поэтому 3 - 10 находится внутри -∞ - + ∞.

Проблема в том, что мне нужно создать запрос, который возвращает все записи из моей таблицы stock_rule, диапазон которых перекрывается с записью stock_rule, которую я пытаюсь создать.

Если счет больше нуля, я не могу сохранить запись.

Я пытаюсь добиться этого с помощью функции COALESCE (MySQL 8.0) следующим образом:

COALESCE(rule.min_price, 0)<=COALESCE(:minPrice, rule.min_price,0) AND 
COALESCE(rule.max_price, 0)<=COALESCE(:minPrice, rule.max_price, 0) AND 
COALESCE(rule.min_price, 0)<=COALESCE(:maxPrice, rule.min_price,0) AND 
COALESCE(rule.max_price, 0)<=COALESCE(:maxPrice, rule.max_price, 0) AND 
COALESCE(:minPrice, 0)>=COALESCE(rule.min_price, :minPrice, 0) AND 
COALESCE(:maxPrice,0)<=COALESCE(rule.min_price, :maxPrice, 0) AND 
COALESCE(:minPrice,0)>=COALESCE(rule.max_price, :minPrice, 0) AND
COALESCE(:maxPrice, 0)<=COALESCE(rule.max_price, :maxPrice, 0)
  • 0
    Может ли цена быть отрицательной?
  • 0
    @Strawberry нет, не может, но, к сожалению, я не могу заставить minPrice быть 0 по умолчанию.
Теги:
coalesce
range
overlapping

1 ответ

0

Я думаю, что-то вроде этого будет работать...

DROP TABLE ranges;

CREATE TABLE ranges
(id seriAL PRIMARY KEY
,range_start INT NULL
,range_end INT NULL
);

INSERT INTO ranges VALUES
(1,NULL,NULL),
(2,3,10),
(3,12,NULL),
(4,NULL,20),
(5,10,11);

  SELECT *
    FROM ranges x
    JOIN ranges y
      ON y.id <> x.id
     AND COALESCE(x.range_start,0) <= y.range_end
     AND COALESCE(x.range_end,(SELECT MAX(range_end) FROM ranges)) >= y.range_start;
+----+-------------+-----------+----+-------------+-----------+
| id | range_start | range_end | id | range_start | range_end |
+----+-------------+-----------+----+-------------+-----------+
|  1 |        NULL |      NULL |  2 |           3 |        10 |
|  4 |        NULL |        20 |  2 |           3 |        10 |
|  5 |          10 |        11 |  2 |           3 |        10 |
|  1 |        NULL |      NULL |  5 |          10 |        11 |
|  2 |           3 |        10 |  5 |          10 |        11 |
|  4 |        NULL |        20 |  5 |          10 |        11 |
+----+-------------+-----------+----+-------------+-----------+


mysql>

Ещё вопросы

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