所以我创建了一个触发器,在我的表中一行名为“Users”的行被更新之后触发,如果用户的“lat”和“lng”列在指定的距离内,我只希望它pg_notify
从另一个lat&价值。我已经创建了一个带有WHERE子句的SQL查询,该子句选择给定纬度和经度值的特定距离内的所有用户,如下所示:
SELECT *
FROM users
WHERE earth_box(ll_to_earth($1,$2), $3) @> ll_to_earth(lat, lng);
WHERE子句仅选择纬度和经度在$3
米纬度和经度点($1, $2)
范围内的用户。现在我想使用where子句创建一个看起来像这样的存储过程,即如果更改的用户的lat和lng点在指定的lat和lng点的指定半径内,则触发通知:
CREATE OR REPLACE FUNCTION notify_on_user_location_update(channel text, specified_lat numeric, specific_lng numeric) RETURNS trigger AS $$
DECLARE
changed_lat numeric;
changed_lng numeric;
specified_radius numeric := 5000;
BEGIN
IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN
changed_lat = NEW.lat;
changed_lng = NEW.lng;
ELSE
changed_lat = OLD.lat;
changed_lng = OLD.lng;
END IF;
IF earth_box(ll_to_earth(specified_lat, specified_lng), specified_radius) @> ll_to_earth(changed_lat, changed_lng)
PERFORM pg_notify(// notification specification here);
ENDIF
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
然而,这不起作用,因此它本质上只是伪代码。我可以以某种方式实现这一目标吗?
答案 0 :(得分:1)
IF
是一个条件,在PL中它必须使用select admitable values。它必须有THEN
子句和END IF;
在您的示例中,它没有允许的条件,并且缺少THEN
子句。此外,ENDIF的空格为;
但是,你可以这样做:
IF
(SELECT count(*)
FROM users
WHERE earth_box(ll_to_earth($1,$2), $3) @> ll_to_earth(lat, lng))>0
THEN
PERFORM pg_notify(// notification specification here);
END IF;