2012-03-23 2 views
0

특정 테이블의 각 열 수를 계산할 수있는 방법을 찾고 있습니다. column_name은 information_schema.columns에서 쿼리해야합니다. 결과는 다음과 같아야합니다.postgresql - 테이블의 각 열의 개수 (null 값 없음)

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 열이 있습니다. 표는 다음과 같다 (표 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