我正在寻找一种方法来获取特定表中每列的计数。应该从information_schema.columns查询列名。结果应该看起来像这样:postgresql - 表中每列的计数(无空值)
column_name : count
我可以用sql查询这个,还是我需要一个我从来没有做过的功能。
赞赏您的帮助。 grassu
我正在寻找一种方法来获取特定表中每列的计数。应该从information_schema.columns查询列名。结果应该看起来像这样:postgresql - 表中每列的计数(无空值)
column_name : count
我可以用sql查询这个,还是我需要一个我从来没有做过的功能。
赞赏您的帮助。 grassu
此查询将创建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
...
感谢的版本你的答案。但是当我执行它时,我得到一个空的结果。 – user1288241 2012-03-23 15:37:31
@ user1288241:适用于我,我在发布之前进行了测试。你知道你需要用你的(符合模式限定的,如果有必要的话)表名替换'mytbl'吗? – 2012-03-23 15:54:31
是的,我做到了。我有一个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
我们需要您的PostgrreSQL – 2012-03-23 15:11:10