[英]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.