はい、returning
があります
INSERT INTO tag ("key", "value")
SELECT 'key1', 'value1'
WHERE NOT EXISTS (
SELECT id, "key", "value"
FROM node_tag
WHERE key = 'key1' AND value = 'value1'
)
returning id, "key", "value"
行がすでに存在する場合にその行を返すには
with s as (
select id, "key", "value"
from tag
where key = 'key1' and value = 'value1'
), i as (
insert into tag ("key", "value")
select 'key1', 'value1'
where not exists (select 1 from s)
returning id, "key", "value"
)
select id, "key", "value"
from i
union all
select id, "key", "value"
from s
行が存在しない場合は、挿入された行を返します。それ以外の場合は、既存の行を返します。
ところで、「key」/「value」のペアがそれを一意にする場合、それは主キーであり、id列は必要ありません。 「キー」と「値」のペアの一方または両方がnullになる可能性がある場合を除きます。