Мне нужно получить типы данных столбцов всех столбцов в таблице, включая типы геометрии. То, что я хотел знать, есть ли функция или SQL, который дает что-то вроде этого:
column_name | data_type
------------+--------------
gid | integer
descr | character varying(32)
class | character varying(10)
area | double precision
geom | geometry(Polygon,3763)
Из нескольких ответов на stackexchange и gis.stackexchange я знаю, что могу получить некоторую информацию с помощью следующего запроса:
SELECT
g.column_name,
g.data_type,
g.character_maximum_length,
g.udt_name,
f.type,
f.srid
FROM
information_schema.columns as g JOIN
geometry_columns AS f
ON (g.table_schema = f.f_table_schema and g.table_name = f.f_table_name )
WHERE
table_schema = 'my_schema_name' and
table_name = 'my_table_name'
Результат:
column_name | data_type | character_maximum_length | udt_name | type | srid
------------+-------------------+--------------------------+----------+---------+------
gid | integer | | | |
descr | character varying | 32 | | |
class | character varying | 10 | | |
area | double precision | |
geom | USER-DEFINED | | geometry | Polygon | 3763
Но есть ли более практичный способ получения информации в нужном мне формате? Или я должен войти в «мир» CASE WHEN
структур и конкатенации строк, чтобы собрать все атрибуты столбцов в одном столбце в этом формате?
Я боюсь, что неожиданный тип данных удивит меня тем, что мне нужен другой атрибут из таблицы information_schema.columns. Т.е. в приведенной выше таблице примеров я не использовал какой-либо numeric (15,2)
тип данных, для которого нужно было бы использовать другие атрибуты (numeric_precision и numeric_scale), которые будут проанализированы CASE WHEN.
where attname = 'geog'
но= 'geom'
работает. Это дает хорошие результаты для значений MultiPolygon, Point и MultiPoint, но я ничего не вижу для типов Line или MultiLine. Эти полигоны считаются?