Lidt ordrigt, men jeg kan ikke komme i tanke om andet:
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;
Den ydre vælger fra tags
ser øjebliksbilledet af tabellen, som det var før de nye tags blev indsat. Den tredje kolonne med konstanten er der kun for at teste forespørgslen, så man kan identificere, hvilke rækker der blev indsat og hvilke der ikke.