Select datatype of the field in postgres

后端 未结 7 2052

How do I get datatype of specific field from table in postgres ? For example I have the following table, student_details ( stu_id integer, stu_name varcha

相关标签:
7条回答
  • 2020-12-12 12:05

    The information schema views and pg_typeof() return incomplete type information. Of these answers, psql gives the most precise type information. (The OP might not need such precise information, but should know the limitations.)

    create domain test_domain as varchar(15);
    
    create table test (
      test_id test_domain, 
      test_vc varchar(15), 
      test_n numeric(15, 3), 
      big_n bigint,
      ip_addr inet
    );
    

    Using psql and \d public.test correctly shows the use of the data type test_domain, the length of varchar(n) columns, and the precision and scale of numeric(p, s) columns.

    sandbox=# \d public.test
                 Table "public.test"
     Column  |         Type          | Modifiers
    ---------+-----------------------+-----------
     test_id | test_domain           |
     test_vc | character varying(15) |
     test_n  | numeric(15,3)         |
     big_n   | bigint                |
     ip_addr | inet                  |
    

    This query against an information_schema view does not show the use of test_domain at all. It also doesn't report the details of varchar(n) and numeric(p, s) columns.

    select column_name, data_type 
    from information_schema.columns 
    where table_catalog = 'sandbox'
      and table_schema = 'public'
      and table_name = 'test';
    
     column_name |     data_type
    -------------+-------------------
     test_id     | character varying
     test_vc     | character varying
     test_n      | numeric
     big_n       | bigint
     ip_addr     | inet
    

    You might be able to get all that information by joining other information_schema views, or by querying the system tables directly. psql -E might help with that.

    The function pg_typeof() correctly shows the use of test_domain, but doesn't report the details of varchar(n) and numeric(p, s) columns.

    select pg_typeof(test_id) as test_id, 
           pg_typeof(test_vc) as test_vc,
           pg_typeof(test_n) as test_n,
           pg_typeof(big_n) as big_n,
           pg_typeof(ip_addr) as ip_addr
    from test;
    
       test_id   |      test_vc      | test_n  | big_n  | ip_addr
    -------------+-------------------+---------+--------+---------
     test_domain | character varying | numeric | bigint | inet
    
    0 讨论(0)
提交回复
热议问题