0

I've got a simple query which inserts data to table when value (unique) does not exist:

DO $$
BEGIN
 IF NOT EXISTS (
 SELECT 1 FROM mytable WHERE hash = 'somelonghash'
 )
 THEN
 INSERT INTO mytable (id, hash, status, datecreated)
 VALUES (123, 'somelonghash', 2, '2018-01-01T12:34:56.789Z');
 END IF;
END $$;

But if I want to receive results like "RETURNING *" if there was an insert, I receive error: "query has no destination for result data". I've tried something like:

DO $$
BEGIN
 IF NOT EXISTS (
 SELECT 1 FROM mytable WHERE hash = 'somelonghash'
 )
 THEN
 INSERT INTO mytable (id, hash, status, datecreated)
 VALUES (123, 'somelonghash', 2, '2018-01-01T12:34:56.789Z')
 RETURNING *;
 END IF;
END $$;

or even like

DO $$
BEGIN
 IF NOT EXISTS (
 SELECT 1 FROM mytable WHERE hash = 'somelonghash'
 )
 THEN
 WITH ins_res AS (
 INSERT INTO mytable (id, hash, status, datecreated)
 VALUES (123, 'somelonghash', 2, '2018-01-01T12:34:56.789Z')
 RETURNING *;
 ) SELECT * FROM ins_res;
 END IF;
END $$;

I assume I'm missing SELECT statement somewhere at the very beginning, like SELECT * FROM (IF-THEN-ELSE results), but can't figure out where. Also this query without IF-THEN works:

WITH ins_res AS (
 INSERT INTO mytable (id, hash, status, datecreated)
 VALUES (123, 'somelonghash', 2, '2018-01-01T12:34:56.789Z')
 RETURNING *
) SELECT * FROM ins_res;
asked Jan 2, 2019 at 14:12
1
  • Why don't you using insert ... on conflict do nothing? Commented Jan 2, 2019 at 15:24

1 Answer 1

2

You can try insert ... select:

 INSERT INTO mytable (id, hash, status, datecreated)
 SELECT 123, 'somelonghash', 2, '2018-01-01T12:34:56.789Z'
 WHERE NOT EXISTS (SELECT 1 FROM mytable WHERE hash = 'somelonghash')
 RETURNING *;

But: is there a reason preventing you from using on conflict instead?

answered Jan 2, 2019 at 14:27
1
  • The reason is that every ON CONFLICT attempt adds id and if this operation goes every 1 minute ids numbers are becoming enormous. Oh, wait. Looks like it works Commented Jan 2, 2019 at 14:30

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.