Как фильтровать таблицу в динамическом postgresql

#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$;