gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:34:41 26 4
gpt4 key购买 nike

所以我创建了一个触发器,它在我的表中名为“Users”的行更新后触发,我只希望它 pg_notify 如果用户的“lat”和“lng”列在与另一个纬度和经度值的指定距离。我已经创建了一个带有 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;

但是,这不起作用,所以它本质上只是伪代码。我能以某种方式让这一切发生吗?

最佳答案

IF 是一个条件,在 PL 中它必须使用选择可接受的值。它必须有一个 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;

关于sql - 您可以在 PostgreSQL 存储过程 IF 子句中执行 WHERE 子句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46943031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com