【发布时间】:2021-02-17 09:41:41
【问题描述】:
我有一个存储矩形的数据库表(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
)
【问题讨论】:
-
通常我会直接转到完全包含的对象并以两种方式检查它(即翻转您正在检查的对象与您正在检查的对象/翻转
_T与非@987654333 @)。我相信这就是您在更新中发现并修复的。我认为从准确性的角度来看你很好,但我不能谈优化。
标签: postgresql geometry trigonometry