如何在动态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$;
我想添加一个检查,如果特定 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$;