如何在动态Postgresql中过滤表格

问题描述

我想添加一个检查,如果特定表包含“名称”列,则仅执行我的查询(在我的情况下,每次在任何表中都没有找到“名称”列时,都会抛出错误)。我很困惑在查询中在哪里使用“ 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.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$;