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