Динамический 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
Другие вопросы по тегам