您可以在 PostgreSQL 存储过程 IF 子句中执行 WHERE 子句吗?
Can you execute WHERE clauses in a PostgreSQL stored procedure IF clause?
所以我创建了一个触发器,它在我的 table 中名为 "Users" 的行更新后触发,我只希望它 pg_notify
如果用户的 "lat"和 "lng" 列与另一个纬度和经度值在指定距离内。我已经创建了一个带有 WHERE 子句的 SQL 查询,该子句选择给定纬度和经度值一定距离内的所有用户,如下所示:
SELECT *
FROM users
WHERE earth_box(ll_to_earth(,), ) @> ll_to_earth(lat, lng);
WHERE 子句仅选择纬度和经度在纬度和经度点 (, )
的
米以内的用户。现在我想使用 where 子句制作一个看起来像这样的存储过程,即如果更改的用户的经纬度点在指定经纬度点的指定半径内,则发出通知:
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;
但是,这不起作用,所以它本质上只是伪代码。我能以某种方式让这一切发生吗?
IF
是一个条件,在 PL 中它必须使用 select 可接受的值。它必须有一个 THEN
子句和一个 END IF;
在您的示例中,它没有可接受的条件并且缺少 THEN
子句。此外,ENDIF 与 space 和 ;
但是,您可以这样做:
IF
(SELECT count(*)
FROM users
WHERE earth_box(ll_to_earth(,), ) @> ll_to_earth(lat, lng))>0
THEN
PERFORM pg_notify(// notification specification here);
END IF;
所以我创建了一个触发器,它在我的 table 中名为 "Users" 的行更新后触发,我只希望它 pg_notify
如果用户的 "lat"和 "lng" 列与另一个纬度和经度值在指定距离内。我已经创建了一个带有 WHERE 子句的 SQL 查询,该子句选择给定纬度和经度值一定距离内的所有用户,如下所示:
SELECT *
FROM users
WHERE earth_box(ll_to_earth(,), ) @> ll_to_earth(lat, lng);
WHERE 子句仅选择纬度和经度在纬度和经度点 (, )
的 米以内的用户。现在我想使用 where 子句制作一个看起来像这样的存储过程,即如果更改的用户的经纬度点在指定经纬度点的指定半径内,则发出通知:
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;
但是,这不起作用,所以它本质上只是伪代码。我能以某种方式让这一切发生吗?
IF
是一个条件,在 PL 中它必须使用 select 可接受的值。它必须有一个 THEN
子句和一个 END IF;
在您的示例中,它没有可接受的条件并且缺少 THEN
子句。此外,ENDIF 与 space 和 ;
但是,您可以这样做:
IF
(SELECT count(*)
FROM users
WHERE earth_box(ll_to_earth(,), ) @> ll_to_earth(lat, lng))>0
THEN
PERFORM pg_notify(// notification specification here);
END IF;