Динамический 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