Где числовая точность и масштаб для поля, найденного в таблицах pg_catalog?
В PostgreSQL данные столбцов для структуры таблицы хранятся в pg_attribute, с несколькими полями в pg_class и парой в pg_attrdef .
Но я не вижу ни точности, ни масштаба для числового типа поля, хранящегося там.
Его можно найти в таблицах INFORMATION_SCHEMA, но я стараюсь их избегать, поскольку они не используют oids для простого объединения с таблицами pg_catalog.
Поэтому возникает вопрос: где точность и масштаб столбца хранятся в системных таблицах postgreSQL?
1 ответ
Решение
Он хранится в 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 ;