Выполнить оператор выбора, если таблица существует - PullRequest
0 голосов
/ 04 июня 2018

ЗАКЛЮЧИТЕЛЬНАЯ ЦЕЛЬ: Создать запрос, который, если таблица существует, выполнить инструкцию для этой таблицы

Я пытаюсь выполнить инструкцию PSQL (9.6), только если определеннаятаблица существует в схеме, но она всегда отвечает синтаксической ошибкой каждый раз, когда я пытаюсь использовать условную IF.

Мой запрос выглядит примерно так ...

IF EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'users') THEN
  SELECT * FROM users;
END IF;

Ивывод ...

ERROR:  syntax error at or near "IF"
LINE 1: IF EXISTS(SELECT 1 FROM information_schema.tables WHERE tabl...
        ^

Нет больше кода, чем этот .Все альтернативы, которые я попробовал, потерпели неудачу.

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Вы можете попробовать следующий код:

select * from users
where exists (select table_name 
from information_schema.tables
where table_name = 'users');

Однако, если вы предоставите свой полный блок / цель, это поможет вам получить лучший результат.

Обновленный запрос:

if (select count(*) from information_schema.tables where table_name = 
'order') = 1 
SELECT * FROM "order" ;
else print N'No Table';

Результаты при запуске без таблицы и с действительной таблицей:

---- Нет таблицы

---- (затронуто 830 строк)

0 голосов
/ 04 июня 2018

Вы можете (и, вероятно, должны) обернуть это в функцию.

CREATE FUNCTION select_if_exists
                ()
RETURNS TABLE (id integer,
               foo text)
AS
$$
BEGIN
  IF EXISTS(SELECT *
                   FROM information_schema.tables
                   WHERE table_schema = current_schema()
                         AND table_name = 'elbat') THEN
    RETURN QUERY SELECT elbat.id,
                        elbat.foo
                        FROM elbat;
  END IF;
END;
$$
LANGUAGE plpgsql;

Если вы вызовете

SELECT *
       FROM select_if_exists();

, когда таблица не существует, вы получите пустой набор.

Создайте таблицу, вызовите ее снова, и вы получите содержимое таблицы.

CREATE TABLE elbat
             AS SELECT 1::integer id,
                       'Hello World!'::text foo;

SELECT *
       FROM select_if_exists();

Но вы не можете отличить снаружи, просто вызвав функцию, если вы получилипустой набор, потому что таблица не существует или потому что она пуста.Тогда вам придется RAISE выдать ошибку (но если вы хотите, чтобы вы просто использовали обычный SELECT, который все равно квакает, если целевой таблицы не существует.)

И таблицадолжен иметь ожидаемые столбцы.В противном случае SELECT в функции не выполняется.И AFAIK нет способа заставить функцию возвращать таблицу переменной формы.

Примечание: если вы на самом деле не хотите возвращать результат запроса, но выполняете DML (или DDL тоже должен работать), выможет также поместить его в анонимный блок без определения функции.Пример:

DO
$$
BEGIN
  IF EXISTS(SELECT *
                   FROM information_schema.tables
                   WHERE table_schema = current_schema()
                         AND table_name = 'elbat') THEN
    DELETE FROM elbat;
  END IF;
END;
$$
LANGUAGE plpgsql;
0 голосов
/ 04 июня 2018

Попробуйте это решение:

 SELECT * FROM table_name
 WHERE EXISTS 
    (
        SELECT 1
        FROM information_schema.tables 
        WHERE table_schema = 'schema_name'
        AND table_name = 'table_name'
    );
...