Запустите функцию sql из запроса EXISTS, используя postgres CTE - PullRequest
1 голос
/ 02 мая 2020

В функции postgres sql я хочу запустить function_update, только если CTE возвращает какие-либо строки. Этот запрос работает для этого.

with common_table as (select 1 where true) select function_update('value') from common_table

Но если я также хочу вернуть, обновил ли function_update какие-либо строки, то он не работает. Функция возвращает true или false правильно, в зависимости от того, вернул ли CTE какие-либо строки или нет, но function_update, похоже, не работает.

with common_table as (select 1 where true) select exists(select function_update('value') from common_table)

function_update - это просто что-то вроде update mytable set column1 = 'changed' where column2 = arg_value. mytable обновляется, когда я запускаю первый запрос выше, но не второй. Почему это не работает, как ожидалось, что мне нужно изменить?

1 Ответ

0 голосов
/ 02 мая 2020

Почему это не работает должным образом

Существует проверка существования и оптимизатор запросов не должен выполнять функцию. Следующий пример показывает, что мы можем ожидать ошибки деления на 0:

select 1 WHERE EXISTS (SELECT 1/0);
-- 1

db <> fiddle demo


что мне нужно изменить?

Один из способов - заставить материализоваться:

select 1 WHERE EXISTS (WITH cte AS MATERIALIZED (SELECT 1/0) SELECT * FROM cte)
-- division by 0

db <> fiddle demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...