mysql - 使用合并检查与数据库端重叠的范围

标签 mysql range overlapping coalesce

我不知道如何在数据库端检查两个可以处理 null 值的范围(例如范围 A:null - null 范围 B:3 - 10)是否重叠。

在本例中,这两个范围重叠,因为在我的代码中 null - null 它等于 -∞ 和 +∞,因此 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)

最佳答案

我想这样的事情会起作用......

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>

关于mysql - 使用合并检查与数据库端重叠的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54589132/

相关文章:

css - 菜单栏重叠站点

php - 如何防止数据库在引号中添加斜杠

mysql - mysql查询全文检索标签数据库慢

mysql - MySQL 中的 Oracle 序列等效项

excel - 在 VBA 中大写动态范围

php - 将数字分成数字组

ruby - 如何知道今天的日期是否在日期范围内?

CSS:阻止 div 和 img 重叠

php - 如何设置PDO默认主机?

java - 如何确保 View 在放置在相对布局中时不会重叠