PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Динамичен SQL (EXECUTE) като условие за оператор IF

Тази конструкция не е възможна:

IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...

Можете да опростите до:

IF EXISTS (SELECT 1 FROM mytable) THEN ...

Но вашият пример вероятно е опростен. Задинамичен SQL изпълнява се с EXECUTE , прочетете ръководството тук. Можете да проверите специалната променлива FOUND веднага след изпълнение на която и да е DML команда, за да видите дали някои редове тук са засегнати:

IF FOUND THEN ...

Въпреки това:

Забележете по-специално, че EXECUTE променя изхода на GET DIAGNOSTICS , но не променя FOUND .

Удебелен акцент мой. За обикновен EXECUTE направете това вместо това:

...
DECLARE
   i int;
BEGIN
   EXECUTE 'SELECT 1 FROM mytable';  -- something dynamic here

   GET DIAGNOSTICS i = ROW_COUNT;

   IF i > 0 THEN ...

Или ако е подходящо - по-специално с резултати само от един ред - използвайте INTO клауза с EXECUTE за да получите директно резултат от динамичната заявка. Цитирам ръководството тук:

Ако е предоставен списък с редове или променливи, той трябва да съвпада точно със структурата на резултатите от заявката (когато се използва променлива на запис, тя ще се конфигурира да съответства автоматично на структурата на резултата). Ако бъдат върнати няколко реда, само първият ще бъде присвоен на INTO променлива. Ако не бъдат върнати редове, на INTO се присвоява NULL променлива(и).

...
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 ...


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не може да се свърже с Postgres DB поради тип удостоверяване 10 не се поддържа

  2. Откриване дали дадена стойност съдържа поне една цифрова цифра в PostgreSQL

  3. Python/postgres/psycopg2:получаване на ID на току-що вмъкнатия ред

  4. няма запис pg_hba.conf за хост

  5. Странно съобщение за грешка в SQLAlchemy:TypeError:обектът 'dict' не поддържа индексиране