8

PostgreSQLでは、テーブルの構造の列データはpg_attributeに格納され、pg_classにいくつかのフィールドがあり、pg_attrdefにいくつかのフィールドがあります。

しかし、そこに格納されているNUMERICフィールドタイプの精度やスケールはどこにも見当たりません。

これはINFORMATION_SCHEMAテーブルにありますが、pg_catalogテーブルに簡単に結合するためにOIDを使用していないため、回避しようとしています。

したがって、問題は次のとおりです。postgreSQLシステムテーブルの列の精度とスケールはどこに保存されますか?

4

1 に答える 1

17

これは、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 ;
于 2010-07-28T08:30:05.127 に答える