你可以在PostgreSQL存储过程IF子句中执行WHERE子句吗?

时间:2017-10-25 22:31:15

标签: sql postgresql stored-procedures location database-trigger

所以我创建了一个触发器,在我的表中一行名为“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;

然而,这不起作用,因此它本质上只是伪代码。我可以以某种方式实现这一目标吗?

1 个答案:

答案 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;