Postgres:检查两个框是否重叠

Postgres: Check if two boxes overlap

我目前在数据库中有以下表格:

create table map (
    id          bigint          not null unique,
    zone        box             not null,
    ...
    primary key(id)
);

create table other_map (
    id          bigint          not null unique,
    zone        box             not null,
    ...
    primary key(id),
    foreign key(id) references map(id)
);

如果 map 中有一行 id 等于新条目的 [=14],我不想在 other_map 中插入新行=] 它们的zone属性重叠。我找到了 this answer,它解释了如何检测重叠框,但我想知道如何(最好地)在 Postgres 中应用它。

这是我到目前为止使用触发器和存储过程得出的结果:

CREATE OR REPLACE FUNCTION PROC_other_map_IU()
RETURNS TRIGGER AS $PROC_other_map_IU$
DECLARE
    id      bigint;
    zone    box;
BEGIN
    SELECT map.id, map.zone INTO id, zone
    FROM map
    WHERE map.id = NEW.id;

    IF zone = NEW.zone THEN
        RAISE EXCEPTION '%\'s zone overlaps with existing %\'s zone', NEW.id, id;
    END IF;

    RETURN NEW;
END;
$PROC_other_map_IU$ LANGUAGE plpgsql;

CREATE TRIGGER TR_other_map_IU
AFTER INSERT OR UPDATE
ON other_map
FOR EACH ROW EXECUTE PROCEDURE PROC_other_map_IU();

现在显然这是错误的,因为它只是检查 zone 属性是否相等。

提前感谢您的输入!干杯!

花了我一段时间,但 Postgres 的 geometric functions and operators(更具体地说是 && - 或重叠 - 运算符)完全符合我的要求:

IF zone && NEW.zone THEN