您可以在 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;