检查重叠与COALESCE数据库端范围

问题描述 投票:0回答:1

我不能找出如何检查数据库侧,如果两个范围,即可以处理空值(例如范围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)
mysql range overlapping coalesce
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>
© www.soinside.com 2019 - 2024. All rights reserved.