Un peu verbeux, mais je ne vois rien d'autre :
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;
La sélection externe parmi les tags
voit l'instantané de la table telle qu'elle était avant les nouvelles balises ont été insérées. La troisième colonne avec la constante n'est là que pour tester la requête afin que l'on puisse identifier quelles lignes ont été insérées et lesquelles non.