PostGIS 테이블에서 각 열의 데이터 유형을 가져 옵니까?


9

지오메트리 유형을 포함하여 테이블에있는 모든 열의 열 데이터 유형을 가져와야합니다. 내가 알고 싶은 것은 다음과 같은 함수 또는 SQL이 있는지 여부입니다.

column_name | data_type
------------+--------------
gid         | integer
descr       | character varying(32)
class       | character varying(10)
area        | double precision
geom        | geometry(Polygon,3763)

stackexchangegis.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)에서는 CASE WHEN에서 구문 분석하기 위해 다른 속성 (numeric_precision 및 numeric_scale)을 사용해야 하는 데이터 유형을 사용하지 않았습니다 .

답변:


14

이론은 그렇습니다.하지만 실제로는 매우 복잡하다는 것을 알 수 있습니다.

  • 모든 테이블 (select * from pg_class)에는 열이 있습니다.
  • 모든 열 (select * from pg_attribute)에는 선택적으로 "typmod"번호가 있습니다.
  • typmod가있는 유형 (pg_type에서 *를 선택)에는 "typmodout"기능이 있습니다.
  • typmod 번호에서 typmod out 함수를 실행하면 유형 이름과 연결되어 사용자가 읽을 수있는 사용자 서명 형식을 구성 할 수있는 문자열이 반환됩니다 ( 'numeric'|| numerictypmodout (786441) 선택) (select geography_typmod_out (1107460))

그러나 psql은 원하는 문자열을 생성합니다. 우리가 생성하는 SQL을 보면 아마도 응답이있을 것입니다.

물론, typeid와 typmod를 사용하여 magic string을 반환하는 magic 함수가 있습니다.

select a.attname, format_type(a.atttypid, a.atttypmod) from pg_attribute a where attname = 'geog';

pg_class에 가입하면이 정보를 테이블별로 얻을 수 있습니다.


나는 결과를 where attname = 'geog'얻지 못하지만 효과 = 'geom'가 있습니다. 이것은 MultiPolygon, Point 및 MultiPoint 값에 대해 좋은 결과를 제공하지만 Line 또는 MultiLine 유형에 대해서는 아무것도 표시되지 않습니다. 그것들은 다각형으로 간주됩니까?
mhkeller

7

간단한 SQL 쿼리를 사용할 수 있습니다.

SELECT * from information_schema.columns where table_name='mytablename'


1
이것은 잘 작동합니다! 팁은 다음과 같습니다. 출력 시간이 길어질 수 있으므로 콘솔에서 확장 디스플레이를 활성화 할 수 있습니다 \pset pager. 페이지를 끈 다음 \x확장 디스플레이를 활성화합니다.
modulitos

7

폴 램지의 도움 나는 이런 식으로 만든 :

SELECT a.attname as column_name, format_type(a.atttypid, a.atttypmod) AS data_type
FROM pg_attribute a
JOIN pg_class b ON (a.attrelid = b.relfilenode)
WHERE b.relname = 'my_table_name' and a.attstattarget = -1;

최신 정보

한편 특정 열 데이터 유형을 요청하는 함수를 만들었습니다.

CREATE OR REPLACE FUNCTION "vsr_get_data_type"(_t regclass, _c text)
  RETURNS text AS
$body$
DECLARE
    _schema text;
    _table text;
    data_type text;
BEGIN
-- Prepare names to use in index and trigger names
IF _t::text LIKE '%.%' THEN
    _schema := regexp_replace (split_part(_t::text, '.', 1),'"','','g');
    _table := regexp_replace (split_part(_t::text, '.', 2),'"','','g');
    ELSE
        _schema := 'public';
        _table := regexp_replace(_t::text,'"','','g');
    END IF;

    data_type := 
    (
        SELECT format_type(a.atttypid, a.atttypmod)
        FROM pg_attribute a 
        JOIN pg_class b ON (a.attrelid = b.oid)
        JOIN pg_namespace c ON (c.oid = b.relnamespace)
        WHERE
            b.relname = _table AND
            c.nspname = _schema AND
            a.attname = _c
     );

    RETURN data_type;
END
$body$ LANGUAGE plpgsql;

사용법은 다음과 같습니다.

SELECT vsr_get_data_type('schema_name.table_name','column_name')

-1

기하학 유형을 확인하려면 'INFORMATION_SCHEMA.COLUMNS'에서 'udt_name'을 확인하고 사용할 수 있습니다!

select column_name,udt_name, data_type, character_maximum_length from INFORMATION_SCHEMA.COLUMNS where table_name =g

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.