#postgresql-9.5
#postgresql-9.5
Вопрос:
Я хочу добавить проверку того, что если конкретная таблица содержит столбец «имена», то выполняется только мой запрос (в моем случае он выдает ошибку каждый раз, когда не находит столбец «имена» ни в одной из таблиц). Я не понимаю, где использовать это выражение «СУЩЕСТВУЕТ» в моем запросе.
create or replace function name_list(schemaname text, tablename text)
RETURNS SETOF text
language 'plpgsql'
as $body$
declare
_query text;
begin
_query := FORMAT('SELECT "names" FROM %I.%I;', schemaname, tablename);
RAISE NOTICE '"%"' , _query;
RETURN QUERY EXECUTE _query;
end;
$body$;
copy(select
table_name,
name_list(table_schema, table_name)
from information_schema.tables)
to 'C:testname_list.csv' DELIMITER ',' CSV HEADER;
Ответ №1:
вариант 1: используйте information_schema.columns
в команде копирования:
copy(select t.table_name, name_list(t.table_schema, t.table_name)
from information_schema.tables AS t
JOIN information_schema.columns AS c
ON (c.table_schema, c.table_name, c.column_name) =
(t.table_schema, t.table_name, 'names')
)
to 'C:testname_list.csv' DELIMITER ',' CSV HEADER;
вариант 2: измените функцию, чтобы пропускать «плохие» таблицы
create or replace function name_list(schemaname text, tablename text)
RETURNS SETOF text
language 'plpgsql'
as $body$
declare
_query text;
begin
IF EXISTS(
SELECT * FROM information_schema.columns AS c
WHERE (c.table_schema, c.table_name, c.column_name) =
(schemaname, tablename, 'names')
) THEN
_query := FORMAT('SELECT "names" FROM %I.%I;', schemaname, tablename);
RAISE NOTICE '"%"' , _query;
RETURN QUERY EXECUTE _query;
ELSE
RETURN;
END IF;
end;
$body$;