Вы можете (и, вероятно, должны) обернуть это в функцию.
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;