Retornar linhas de INSERT com ON CONFLICT sem precisar atualizar

Tenho uma situação em que frequentemente preciso obter uma linha de uma tabela com uma restrição exclusiva e, se não houver, crie-a e retorne. Por exemplo, minha tabela pode ser:

CREATE TABLE names(
    id SERIAL PRIMARY KEY,
    name TEXT,
    CONSTRAINT names_name_key UNIQUE (name)
);

E contém:

id | name
 1 | bob 
 2 | alice

Então eu gostaria de:

 INSERT INTO names(name) VALUES ('bob')
 ON CONFLICT DO NOTHING RETURNING id;

Ou talvez:

 INSERT INTO names(name) VALUES ('bob')
 ON CONFLICT (name) DO NOTHING RETURNING id

e devolvê-lo1. Contudo,RETURNING retorna apenas linhas inseridas ou atualizadas. Portanto, no exemplo acima, ele não retornaria nada. Para que funcione como desejado, eu realmente precisaria:

INSERT INTO names(name) VALUES ('bob') 
ON CONFLICT ON CONSTRAINT names_name_key DO UPDATE
SET name = 'bob'
RETURNING id;

o que parece meio complicado. Eu acho que minhas perguntas são:

Qual é o motivo para não permitir o (meu) comportamento desejado?

Existe uma maneira mais elegante de fazer isso?

questionAnswers(1)

yourAnswerToTheQuestion