2012-03-23 37 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

相關問題