2012-03-23 2 views
0

特定のテーブルの各カラムの数を取得する方法を探しています。列名はinformation_schema.columnsから照会する必要があります。結果は次のようになります。postgresql - テーブル内の各カラムの数(ヌル値なし)

column_name : count 

は、私は、SQLでこれを照会することができますか私は、私が行ったことがない機能が必要なのです。

あなたのお手伝いに感謝します。 grassu

+1

は、私たちはあなたの答えをPostgrreSQL –

答えて

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以降)が必要です。

string_agg()機能にはPostgres 9.0以降が必要です。古いバージョンでは、array_to_string(array_agg(...), ', ')を代用することができます。

特別なキャスト'mytbl'::regclassについて不思議に思うかもしれません。マニュアルのobject identifier typesについてもっと読む。

BTW:NULL値はデフォルトでCOUNT(col)に追加されません。

mytblの(スキーマ修飾された)テーブル名に置き換えてください。あなたのケースでは、それは次のようになります。

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

あなたが混在する場合またはそれ以外の場合はめちゃめちゃ識別子を使用してする必要がある場合には(引用符に注意してください):

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

感謝のバージョンを必要とします。しかし、私はそれを実行すると空の結果が得られます。 – user1288241

+0

@ user1288241:作品は私のために、私は投稿する前にテストしました。 'mytbl'にあなたの(スキーマ修飾された、必要であれば)テーブル名を代入する必要があることを知っていますか? –

+0

はい私はそれをしました。私はpostgresql 9.1を持っていて、テーブルには約600列あります。 invtype文字が変化、表geoproject.mes_wastab ( invid文字変化(16)を作成する(3)、 smpid整数、 smpname文字変化(40)、 smpdate日、 smptime文字変化(:テーブルは次のようになります5)、 o2st_p倍精度、 wspgokna倍精度、倍精度o2_p 、 absenkungs倍精度、 klarstrom3倍精度、 klarstrom2倍精度、 klarstrom4倍精度、 ........... ............. ....... ) WITH( OIDS = FALSE );何か案が? – user1288241

関連する問題