2010-07-28 17 views
4

在PostgreSQL中,表結構的列數據存儲在pg_attribute中,pg_class中有幾個字段,pg_attrdef中有一對。pg_catalog表中找到的字段的NUMERIC精度和標度在哪裏?

但我沒有看到存儲在那裏的NUMERIC字段類型的精度或比例。

它可以在INFORMATION_SCHEMA表中找到,但我試圖避免它們,因爲它們不使用oid輕鬆連接到pg_catalog表。

所以問題是: 哪裏列精度和規模存儲在postgreSQL系統表?

回答

6

它存儲在pg_attribute中的atttypmod列中。所有信息均在視圖information_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 2010-07-28 13:46:58

+0

是的,也是從這個觀點使用的功能。使用pg_view和pg_proc來獲取細節。 – 2010-07-28 13:50:22

+0

它幫助了我,謝謝 – 2015-03-31 17:08:40