如何在动态postgresql中过滤table

How to filter table in dynamic postgresql

我想添加一个检查,如果特定 table 包含“名称”列,则只执行我的查询(在我的例子中,每次它在中找不到“名称”列时都会抛出错误table 中的任何一个)。我很困惑在我的查询中在哪里使用“EXISTS”语句。

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:\test\name_list.csv' DELIMITER ',' CSV HEADER;

变体 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:\test\name_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$;