[英]Updating multiple columns in Postgresql
我有一个名为 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 ...
^
任何见解表示赞赏!
您可以简单地将SELECT
移到CASE
语句之外:
update availability a0 set (a0.start_time, a0.end_time) = (
select case 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)
else row(NEW.start_time, NEW.end_time)
end
from availability a where a.uname = new.uname and a.start_date = new.start_date
);
顺便说一句:我无法对此进行测试,但没有 where 子句的更新对我来说看起来很奇怪。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.