2010-07-28 20 views
4

Dans PostgreSQL, les données de colonne pour la structure d'une table sont stockées dans pg_attribute, avec quelques champs dans pg_class, et un couple dans pg_attrdef.Où sont la précision et l'échelle de NUMERIC pour un champ trouvé dans les tables pg_catalog?

Mais je ne vois pas la précision ou l'échelle pour un type de champ NUMERIC stocké là-bas n'importe où.

Il peut être trouvé dans les tables INFORMATION_SCHEMA, mais j'essaie de les éviter, car ils n'utilisent pas d'oids pour une jointure facile aux tables pg_catalog. Donc, la question est: Où la précision et l'échelle des colonnes sont-elles stockées dans les tables système postgreSQL?

Répondre

6

Il est stocké dans pg_attribute, dans la colonne atttypmod. Toutes les informations sont disponibles dans la vue information_schema.columns. Cette vue utilise quelques requêtes pour calculer les valeurs, ce sont les bases nues:

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

Merci beaucoup. Cet extrait de code a-t-il été extrait de la définition de la vue information_schema.columns? – Rdbhost

+0

Oui c'est le cas, et aussi des fonctions que cette vue utilise. Utilisez pg_view et pg_proc pour obtenir les détails. –

+0

ça m'a aidé, merci –