【发布时间】:2021-12-28 05:15:08
【问题描述】:
我有一个名为 Availability(uname, date, start_time, end_time) 的表,用户可以在其中输入他们空闲的时间段。现在我想在插入或更新可用性表之前创建一个触发器,以检查新输入是否与同一用户在同一日期的现有可用性重叠。如果重叠,我想合并两个时隙。到目前为止,这是我的代码:
create or replace function check_overlap()
returns trigger as $$
begin
update availability a0
set (a0.start_time, a0.end_time) =
case (select a.start_time, a.end_time from availability a where a.uname = new.uname and a.start_date = new.start_date)
when NEW.start_time < a0.start_time and NEW.end_time < a0.end_time then row(NEW.start_time, a0.end_time)
when NEW.start_time > a0.start_time and NEW.end_time > a0.end_time then row(a0.start_time, NEW.end_time)
when NEW.start_time < a0.start_time and NEW.end_time > a0.end_time then row(NEW.start_time, NEW.end_time)
when NEW.start_time > a0.start_time and NEW.end_time < a0.end_time then row(a0.start_time, a0.end_time)
end;
end;
$$ language plpgsql;
create trigger tg_INSERT_UPDATE_avail
before insert or update
on availability
for each row
execute function check_overlap();
现在,问题是我遇到了这个错误:
ERROR: source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression
LINE 3: case (select a.s_time, a.e_time from availability a where ...
^
感谢任何见解!
【问题讨论】:
标签: sql postgresql plpgsql