查找在给定列中包含数据的所有表

时间:2017-08-04 08:29:10

标签: postgresql

我有一组大约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行的行数。

请原谅我的格式和缺少查询,因为我在移动设备上发布了这个问题。

1 个答案:

答案 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');