【发布时间】:2021-11-19 04:14:42
【问题描述】:
请帮助我创建 postgresql FUNCTION。
我有两个疑问:
如果第一个没有返回值
SELECT * FROM event e
WHERE e.organizer_id IN (SELECT u.id FROM "user" u WHERE u.school_id = 9)
OR e.id IN (SELECT i.event_id FROM invite i WHERE i.user_id IN (SELECT u.id FROM "user" u WHERE u.school_id = 9));
那么我需要调用第二个查询
SELECT * FROM event e
INNER JOIN user u on u.id = e.organizer_id
INNER JOIN school s on u.school_id = s.id
WHERE u.school_id = :schoolId and ST_DWithin(ST_Transform(e.geom, 2163), ST_Transform(s.geom,2163), :radius * 1609.34)
我试图创建一个函数但卡住了。我对SQL没有太多经验,请帮忙。
我是这样想的:
CREATE FUNCTION all_nearby_events(mySchoolID INT) RETURNS event AS $$
DECLARE
user_ids bigserial; -- save List of user ids because i need it twice
BEGIN
user_ids :=(SELECT u.id FROM "user" u WHERE u.school_id = mySchoolID);
SELECT * FROM event e
INNER JOIN user u on u.id = e.organizer_id
INNER JOIN school s on u.school_id = s.id
WHERE u.school_id = :schoolId and ST_DWithin(ST_Transform(e.geom, 2163), ST_Transform(s.geom,2163), :radius * 1609.34)
and not exists (
SELECT * FROM event e WHERE e.organizer_id IN (user_ids) OR e.id IN (SELECT i.event_id FROM invite i WHERE i.user_id IN (user_ids))
)
union all
SELECT * FROM event e WHERE e.organizer_id IN (user_ids) OR e.id IN (SELECT i.event_id FROM invite i WHERE i.user_id IN (user_ids));
END;
$$
LANGUAGE plpgsql;
【问题讨论】:
标签: sql postgresql postgresql-13