Een beetje uitgebreid, maar ik kan niets anders bedenken:
with all_tags (name) as (
values ('tag10'), ('tag6'), ('tag11')
), inserted (id, name) as (
INSERT INTO tags (name)
select name
from all_tags
ON CONFLICT DO NOTHING
returning id, name
)
select t.id, t.name, 'already there'
from tags t
join all_tags at on at.name = t.name
union all
select id, name, 'inserted'
from inserted;
De buitenste selectie uit tags
ziet de momentopname van de tafel zoals deze was voorheen de nieuwe tags zijn ingevoegd. De derde kolom met de constante is er alleen om de query te testen, zodat men kan zien welke rijen zijn ingevoegd en welke niet.