Уменьшите дублирование в функции postgres plpg sql с помощью CTE - PullRequest
0 голосов
/ 01 мая 2020

В функции SQL я могу вернуть логическое значение, если я выполняю

with myquery as (delete from mytable where id = 'value1' returning 1)
select exists (select * from another_function('value2') where (select count(*) from myquery) > 0);

Но в функции plpg sql она не работает и выдает ошибку query has no destination for result data.

В этой функции я хочу выполнить another_function, если какие-либо строки были фактически удалены из mytable. Проблема в том, что я повторяю всю часть select exists, потому что я использую это в нескольких функциях.

Можно ли переместить больше этих логи c в another_function? Чтобы я мог сделать что-то подобное?

with myquery as (delete from mytable where id = 'value1' returning 1)
select * from another_function('value2', myquery)

Как я могу передать CTE в функцию, чтобы мне не нужно было повторять select exists и where (select count(*) from myquery) > 0) каждый раз, когда я хочу вызвать another_function

1 Ответ

1 голос
/ 01 мая 2020

Я ожидаю, что вспомогательная функция примет аргумент, такой как id, возвращаемый из delete. Тогда это будет выглядеть следующим образом:

with d as (
      delete from mytable
      where id = 'value1'
      returning id
     )
select another_function('value2', d.id)
from d;

Это работает по одному значению за раз, но это, как правило, то, что нужно. Если вы хотите, чтобы все идентификаторы передавались одновременно, вы можете использовать массив:

with d as (
      delete from mytable
      where id = 'value1'
      returning id
     )
select another_function('value2', array_agg(d.id))
from d;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...