Динамический SQL (EXECUTE) как условие для оператора IF
Я хочу выполнить динамический оператор SQL, возвращаемое значение которого является условным для IF
о себе:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN
это генерирует ошибку ERROR: type "execute" does not exist
.
можно ли это сделать, или необходимо выполнить SQL перед оператором IF в переменную, а затем проверить переменную как условную?
3 ответов
эта конструкция невозможна:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
вы можете упростить до:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
но ваш пример, вероятно, просто упрощен. Для динамический SQL выполнена с EXECUTE
, читаем инструкцию здесь. Вы можете проверить для FOUND
после RETURN QUERY EXECUTE
:
IF FOUND THEN ...
однако:
внимание, в частности, что
EXECUTE
изменяет выходные данныеGET DIAGNOSTICS
, но не меняетFOUND
.
жирным выделено мной. Для простого EXECUTE
вместо этого:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable';
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
или если удобно - в частности, только с однострочными результатами-используйте INTO
п. С EXECUTE
чтобы получить результат от динамического запроса напрямую. Я цитирую руководство здесь:
если предоставляется список строк или переменных, он должен точно соответствовать структура результатов запроса (когда используется переменная записи, она настроит себя, чтобы соответствовать структуре результата автоматически). Если возвращается несколько строк, только первая будет назначена
INTO
переменной. Если строки не возвращаются, NULL присваиваетсяINTO
переменная(ы).
...
DECLARE
_var1 int; -- init value is NULL unless instructed otherwise
BEGIN
EXECUTE format('SELECT var1 FROM %I WHERE x=y LIMIT 1', 'my_Table')
INTO _var1;
IF _var1 IS NOT NULL THEN ...
Мэтт,
из синтаксиса выше вы пишете PL / pgSQL, а не SQL. Исходя из этого предположения, есть два способа сделать то, что вы хотите, но для обоих потребуется две строки кода:
EXECUTE 'SELECT EXISTS (SELECT 1 FROM ' || table_variable || ' );' INTO boolean_var;
IF boolean_var THEN ...
или:
EXECUTE 'SELECT 1 FROM ' || table_variable || ' );';
IF FOUND THEN ...
"FOUND" - специальная переменная, которая проверяет, вернул ли последний запрос какие-либо строки.