我正在尋找一種方法來獲取特定表中每列的計數。應該從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