在pg_catalog表中,如何找到字段的NUMERIC精度和标度?

9
在PostgreSQL中,表结构的列数据存储在pg_attribute中,pg_class中有几个字段,pg_attrdef中有一对字段。

但我没有看到NUMERIC字段类型的精度或比例存储在那里的任何地方。

它可以在INFORMATION_SCHEMA表中找到,但我正在尝试避免使用它们,因为它们不使用oids轻松加入到pg_catalog表。

所以问题是:列的精度和比例存储在哪个postgreSQL系统表中?

1个回答

21

类型信息存储在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 ;

非常感谢。 这段代码片段是从information_schema.columns视图定义中提取的吗? - Rdbhost
是的,而且还要从此视图使用的函数中获取。使用pg_view和pg_proc获取详细信息。 - Frank Heikens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接