[英]Selecting overlapping rectangles from a database table
我有一个存储矩形的数据库表 (postgres),由左下角和右上角的网格坐标(X 和 Y)定义。 该表定义如下......
CREATE TABLE tableA (
minX NUMERIC,
minY NUMERIC,
maxX NUMERIC,
maxY NUMERIC
);
其中minX
和minY
是左下角的坐标, maxX
和maxY
是右上角的坐标。
我正在尝试提出一个 SQL 查询,该查询将拉回与目标矩形重叠的任何矩形的记录,该目标矩形也由左下角和右上角 - minX_T
、 minY_T
、 maxX_T
、 maxY_T
。
到目前为止,这就是我想出的...
SELECT * FROM tableA
WHERE
(
(
(minY <=minY_T AND maxY >= minY_T)
AND
(minX <=minX_T AND maxX >= minX_T)
)
OR
(
(minY <=maxY_T AND maxY >= maxY_T)
AND
(minX <=maxX_T AND maxX >= maxX_T)
)
OR
(
(minY <=maxY_T AND maxY >= maxY_T)
AND
(minX <=minX_T AND maxX >= minX_T)
)
OR
(
(minY <=minY_T AND maxY >= minY_T)
AND
(minX <=maxX_T AND maxX >= maxX_T)
)
)
这(部分)有效它从数据库中选择矩形的一角落在目标内的任何记录,但是它不会找到所有变化并且它是 SQL 的一个非常混乱的位。乍一看这是一个非常简单的问题,但我我已经为此绞尽脑汁好几个小时了——每次我认为我有一个解决方案时,我都会发现一个它不起作用的场景!
有任何想法吗? (顺便说一句 - 这仅适用于边长为水平或垂直的矩形)
好的,又过了几个小时,这个更简单的版本似乎可以解决问题
SELECT * FROM tableA
WHERE
(
minX_T < maxX
AND
maxX_T > minX
AND
minY_T < maxY
AND
maxY_T > minY
)
不要重新发明轮子(或者在这种情况下是盒子)。 Postgres 提供了几何数据类型(在本例中为点和框)和所需的几何函数。
以下 sql function 将从您的表格中返回任何重叠的“框”:
create or replace
function overlaps_rectangle( rectangle_in box)
returns setof tablea
language sql
as $$
select *
from tablea
where box( point(maxx,maxy),point(minx,miny)) && rectangle_in ;
$$;
请参阅此处的示例:
function其实并不需要,sql语句本身可以作为脚本运行。 我只是发现将参数传递给 function 比修改脚本更容易。 更进一步,根据其他用途,您实际上可以将值存储为 Points 甚至 Boxes。 示例包含在上述参考中。 注意:作为一个盒子
可以在输入中提供任意两个对角,但值将根据需要重新排序以按该顺序存储右上角和左下角。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.