Динамический 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" - специальная переменная, которая проверяет, вернул ли последний запрос какие-либо строки.


SET @SQLQUERY='SELECT 1 FROM mytable'

EXEC (@SQLQUERY)
If @@RowCount >0  THEN