sql - Nullify column in update if subquery returns empty -
i have following sql
query
update container set member_containers = members ( select inter_container_membership.owning_container_id owner_cont ,array_to_string(array_agg(inter_container_membership.member_container_id),',') members inter_container_membership group inter_container_membership.owning_container_id) v container.id = owner_cont;
the problem is, if sub-query
not return member_containers
not updated, need set null if it's case, i've tried using exists
clause didn't work.
update container set member_containers = case when exists ( select * inter_container_membership container.id = inter_container_membership.owning_container_id ) members else null end ( select inter_container_membership.owning_container_id owner_cont ,array_to_string(array_agg(inter_container_membership.member_container_id),',') members inter_container_membership group inter_container_membership.owning_container_id) v container.id = owner_cont;
so thinking of nullifying out member_containers
before updating it, not find way doing that.
to set column null in case subquery not find anything, could use correlated subquery instead of join:
update container c set member_containers = ( select string_agg(member_container_id, ',') inter_container_membership i.owning_container_id = c.id group owning_container_id );
often, kind of query wrong, because column shouldn't nullified if nothing found. seem want that.
also, correlated subqueries tend slow. consider add left join instead (doing same):
update container c set member_containers = i.members container c1 left join ( select owning_container_id ,string_agg(member_container_id, ',') members inter_container_membership group 1 ) on i.owning_container_id = c1.id c.id = c1.id;
also using string_agg()
instead of array_to_string(array_agg(...))
. needs postgres 9.0+.
Comments
Post a Comment