2012-03-23 72 views
0

我正在寻找一种方法来获取特定表中每列的计数。应该从information_schema.columns查询列名。结果应该看起来像这样:postgresql - 表中每列的计数(无空值)

column_name : count 

我可以用sql查询这个,还是我需要一个我从来没有做过的功能。

赞赏您的帮助。 grassu

+1

我们需要您的PostgrreSQL – 2012-03-23 15:11:10

回答

2

此查询将创建DML语句以获得所需内容。

SELECT 'SELECT ' || string_agg('count(' || quote_ident(attname) || ')', ', ') 
    || 'FROM ' || attrelid::regclass 
FROM pg_attribute 
WHERE attrelid = 'mytbl'::regclass 
AND attnum >= 1   -- exclude tableoid & friends (neg. attnum) 
AND attisdropped is FALSE -- exclude deleted columns 
GROUP BY attrelid; 

返回:

SELECT count(col1), count(col2), count(col3), ... 
FROM mytbl 

可以自动执行它,太。但是,在计划SQL中,您需要在plpgsql函数中使用EXECUTE或为此使用DO语句(PostgreSQL 9.0或更高版本)。

您还需要Postgres 9.0或更高版本的string_agg()函数。在旧版本中,您可以替换:array_to_string(array_agg(...), ', ')

您可能想知道特别演员'mytbl'::regclass。阅读手册中关于object identifier types的更多信息。

顺便说一下:NULL默认情况下,值不会添加到COUNT(col)

mytbl替换(模式限定的)表名。你的情况应该是:

... 
WHERE attrelid = 'geoproject.mes_wastab'::regclass 
... 

如果您应该使用大小写混合或以其他方式搞砸标识符(注意引号):

... 
WHERE attrelid = '"gEopRoject"."MES_wastab"'::regclass 
... 
+0

感谢的版本你的答案。但是当我执行它时,我得到一个空的结果。 – user1288241 2012-03-23 15:37:31

+0

@ user1288241:适用于我,我在发布之前进行了测试。你知道你需要用你的(符合模式限定的,如果有必要的话)表名替换'mytbl'吗? – 2012-03-23 15:54:31

+0

是的,我做到了。我有一个postgresql 9.1,该表有大约600列。表看起来像这样:CREATE TABLE geoproject.mes_wastab ( 因维字符改变(16), invtype字符改变(3), smpid整数, smpname字符改变(40), smpdate日期, smptime字符改变( 5) o2st_p双精度, wspgokna双精度, o2_p双精度, absenkungs双精度, klarstrom3双精度, klarstrom2双精度, klarstrom4双精度, ........... ............. ....... ) WITH( OIDS = FALSE );任何想法? – user1288241 2012-03-23 16:05:17