2010-07-28 4 views
4

PostgreSQL에서 테이블 구조에 대한 열 데이터는 pg_attribute에 저장되며 pg_class에는 몇 개의 필드가 있고 pg_attrdef에는 몇 개의 필드가 저장됩니다.pg_catalog 테이블에있는 필드의 숫자와 정밀도는 어느 정도입니까?

그러나 NUMERIC 필드 유형의 정밀도 또는 배율이 어디에도 저장되어 있지 않습니다.

INFORMATION_SCHEMA 테이블에서 찾을 수 있지만 pg_catalog 테이블에 쉽게 결합하기 위해 oids를 사용하지 않으므로 피하려고합니다.

그래서 질문은 : postgreSQL 시스템 테이블에 저장된 열의 정밀도와 축척은 어디에 있습니까?

답변

6

atttypmod 열에 pg_attribute에 저장됩니다. 모든 정보는 info_schema.columns 뷰에서 볼 수 있습니다. 이보기는 값을 계산하기 위해 몇 가지 쿼리를 사용합니다. 기본 사항은 다음과 같습니다.

SELECT 
    CASE atttypid 
     WHEN 21 /*int2*/ THEN 16 
     WHEN 23 /*int4*/ THEN 32 
     WHEN 20 /*int8*/ THEN 64 
     WHEN 1700 /*numeric*/ THEN 
       CASE WHEN atttypmod = -1 
        THEN null 
        ELSE ((atttypmod - 4) >> 16) & 65535  -- calculate the precision 
        END 
     WHEN 700 /*float4*/ THEN 24 /*FLT_MANT_DIG*/ 
     WHEN 701 /*float8*/ THEN 53 /*DBL_MANT_DIG*/ 
     ELSE null 
    END AS numeric_precision, 
    CASE 
    WHEN atttypid IN (21, 23, 20) THEN 0 
    WHEN atttypid IN (1700) THEN    
     CASE 
      WHEN atttypmod = -1 THEN null  
      ELSE (atttypmod - 4) & 65535   -- calculate the scale 
     END 
     ELSE null 
    END AS numeric_scale, 
    * 
FROM 
    pg_attribute ; 
+0

고맙습니다. information_schema.columns 뷰 정의에서이 코드 스 니펫을 추출 했습니까? – Rdbhost

+0

예입니다. 또한이보기에서 사용하는 함수에서도 가능합니다. 세부 사항을 얻으려면 pg_view와 pg_proc를 사용하십시오. –

+0

덕분에 도움이되었습니다. 감사합니다. –

관련 문제