Условно выполнять SQL операторы в сырой postgresql функции? - PullRequest
1 голос
/ 08 февраля 2020

Мне не совсем ясно, возможно ли условно выполнять операторы SQL с использованием необработанных SQL функций в Postgres, или вам нужно использовать plpgsql с IF операторами для этого.

По сути, я пытаюсь сделать следующее:

CREATE OR REPLACE FUNCTION public.usp_reply_to_convo(convo_id BIGINT, person_id INTEGER, body TEXT)
  RETURNS TABLE(convo_reply_id BIGINT, person_id integer)
  LANGUAGE sql
AS $function$
-- SELECT timeout_until FROM person WHERE person_id = $1;
-- IF timeout_until > now() RETURN timeout_until
-- ELSE do the below
INSERT INTO convo_reply (convo_id, person_id, body) VALUES ($1, $2, $3);
RETURNING convo_reply_id, person_id;
$function$;

Где пользователь может ответить на разговор, если его значение timeout_until меньше now(). А если это не так, то запрос не выполняется, и вместо этого возвращается значение времени ожидания.

Возможно ли подобное с необработанным SQL или plpgsql необходимо?

Кроме того, есть ли способ справиться с тем фактом, что эта функция может возвращать две вещи? Либо возвращает метку времени ожидания, либо идентификатор ответа на разговор. Не уверен, как справиться с этими конкурирующими проблемами.

1 Ответ

1 голос
/ 08 февраля 2020

Я думаю, что вы можете делать то, что вы хотите с CTE. Вы можете сформулировать это примерно так:

with p as (
      select timeout_until 
      from person 
      where person_id = $1
     ),
     i as (
      insert into convo_reply (convo_id, person_id, body) 
          select $1, $2, $3
          where (select timeout_until from p) <= now()
          returning convo_reply_id, person_id
    )
select ?
from p left join
     i
     on 1=1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...