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