我有一组大约500个模式,其中许多都有共同的列。现在每当我有更新时,我都必须手动查看具有这些列的所有模式,并更新它们是否有数据。
我试图让所有表中的列都针对特定列数据的行数。
EG。假设我在字母A,B和C中有col1
列。我可以按以下格式获取数据。
Col1 table number
1005 A 3
1005 B 4
1005 C 5
1006 A 7
其中1005是col1
中的一行。 A是桌子。 3是表A中col1
中1005行的行数。
请原谅我的格式和缺少查询,因为我在移动设备上发布了这个问题。
答案 0 :(得分:1)
创建以下功能并将其用于提取数据
DROP FUNCTION IF EXISTS fun_test (CHARACTER VARYING);
drop type if exists fun_test_out;
create type fun_test_out as(
"schema_name" VARCHAR(255)
,"table_name" VARCHAR(255)
,"column_value" VARCHAR(255)
,"count" INT
);
CREATE OR REPLACE FUNCTION fun_test (colname CHARACTER VARYING)
RETURNS SETOF fun_test_out
AS
$$
declare
r fun_test_out%rowtype;
l_colname VARCHAR(255);
l_cte TEXT;
l_insert TEXT;
tables RECORD;
begin
l_colname := colname ;
DROP TABLE IF EXISTS tmp_output;
CREATE temp TABLE tmp_output
(
schema_name VARCHAR(255)
,table_name VARCHAR(255)
,column_value VARCHAR(255)
,count INT
);
DROP TABLE IF EXISTS tmp_tablename;
CREATE temp TABLE tmp_tablename
(
table_schema VARCHAR(255)
,table_name VARCHAR(255)
,column_name VARCHAR(255)
);
l_cte := 'Insert into tmp_tablename ' || chr(10) ||
'SELECT table_schema,table_name,column_name' || chr(10) ||
'FROM information_schema.columns WHERE column_name = ''' || l_colname || '''' ;
EXECUTE l_cte;
FOR tables IN
SELECT table_schema,table_name,column_name
FROM tmp_tablename
LOOP
l_insert = 'Insert into tmp_output ' || chr(10) ||
'SELECT ''' || tables.table_schema || ''',''' || tables.table_name || ''',' || tables.column_name || ',COUNT(*)' || chr(10) ||
'FROM ' || tables.table_schema || '.' || tables.table_name || chr(10) ||
'group by ' || tables.column_name
;
EXECUTE l_insert;
END LOOP;
/******************************************************************
FINAL SELECT
******************************************************************/
FOR r in
select *
from tmp_output
loop
RETURN NEXT r;
END LOOP;
DROP TABLE IF EXISTS tmp_output;
DROP TABLE IF EXISTS tmp_tablename;
end
$$
LANGUAGE PLPGSQL;
您可以使用以下声明
调用该函数Select * from fun_test('Column_name');