繁体   English   中英

更新 Postgresql 中的多个列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM