Как получить числовую точность элементов массива, числовую шкалу и метаданные точности даты и времени в PostgreSQL?

Для проекта с открытым исходным кодом мне нужно получить «числовую точность», «числовую шкалу» и «точность даты и времени» массивов в базе данных PostgreSQL.

Я использую information_schema.columns и присоединяю его к information_schema.element_types, чтобы получить информацию об элементах массива в столбцах, но это не так. не иметь точности и т. д.

На странице element_types указано, что (numeric_precision, numeric_scale и datetime_precision) всегда равны нулю, поскольку эта информация не применяется к типам данных элементов массива в PostgreSQL

Я думал, что неправильно истолковал это утверждение, потому что я могу определять столбцы массива с числовой точностью в таблицах. Например:

CREATE TABLE public.type_table (
  id SERIAL,
  some_field NUMERIC(4,2) [],
  CONSTRAINT type_table_key PRIMARY KEY(id)
) 

Также я вижу некоторые функции information_schema._pg_datetime_precision(), information_schema._pg_numeric_precision() и information_schema._pg_numeric_scale(), но не смог найти их в документации.

Как я могу получить «числовую точность», «числовую шкалу» и «точность даты и времени» элементов массива в columns, function arguments и domains?


person ozm    schedule 03.08.2019    source источник


Ответы (1)


Вы можете использовать информацию из pg_attribute и использовать format_type(), чтобы получить удобочитаемый вид:

select attname, format_type(atttypid, c.atttypmod)
from pg_attribute c
where attrelid = 'public.type_table'::regclass
and attnum > 0;
person a_horse_with_no_name    schedule 03.08.2019
comment
Спасибо за ответ. format_type обеспечивает точность и масштаб в виде текста, такого как character varying(20), который требует дальнейшего синтаксического анализа. Если возможно, не могли бы вы предложить запрос для числовой точности, числовой шкалы и точности даты и времени без разбора? - person ozm; 03.08.2019
comment
@ozm: эта информация каким-то образом закодирована в atttypmod, я не знаю, как ее извлечь, кроме как с помощью format_type() - person a_horse_with_no_name; 03.08.2019