selectpostgres中字段的数据types

如何从postgres中的表中获取特定字段的数据types? 例如,我有以下表student_details(stu_id整数,stu_name varchar(30),joined_date时间戳);

在这个使用字段名称/或任何其他方式,我需要获取特定字段的数据types。 有没有可能?

您可以从information_schema获取数据types(这里引用8.4文档,但这不是一个新function):

=# select column_name, data_type from information_schema.columns -# where table_name = 'config'; column_name | data_type --------------------+----------- id | integer default_printer_id | integer master_host_enable | boolean (3 rows) 

您可以使用pg_typeof()函数,该函数也适用于任意值。

 SELECT pg_typeof("stu_id"), pg_typeof(100) from student_details limit 1; 

运行psql -E然后运行\d student_details

信息模式视图和pg_typeof()返回不完整的types信息。 在这些答案中, psql提供了最精确的types信息。 (OP可能不需要这些确切的信息,但应该知道这个限制。)

 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 ); 

使用psql\d public.test正确显示了数据typestest_domain ,varchar(n)列的长度以及数字(p,s)列的精度和比例。

 sandbox =#\ d public.test
             表“public.test”
 列| types| 修饰符
 --------- + ----------------------- + -----------
  test_id |  test_domain |
  test_vc | 字符变化(15)|
  test_n | 数字(15,3)|
  big_n |  bigint |
  ip_addr |  inet |

这个针对information_schema视图的查询根本显示test_domain 。 它也不报告varchar(n)和numeric(p,s)列的细节。

 select column_name, data_type from information_schema.columns where table_catalog = 'sandbox' and table_schema = 'public' and table_name = 'test'; 
  column_name | 数据types
 ------------- + -------------------
  test_id | 性格不一
  test_vc | 性格不一
  test_n | 数字
  big_n |  BIGINT
  ip_addr |  INET

可以通过join其他information_schema视图或直接查询系统表来获取所有信息。 psql -E可能有帮助。

函数pg_typeof()正确地显示了test_domain ,但不报告varchar(n)和numeric(p,s)列的详细信息。

 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 | 字符变化| 数字|  bigint |  INET

试试这个请求:

 SELECT column_name, data_type FROM information_schema.columns WHERE table_name = YOUR TABLE AND column_name = YOU FIELD; 

如果您喜欢“Mike Sherrill”解决scheme,但不想使用psql,则使用此查询获取缺less的信息:

 select column_name, case when domain_name is not null then domain_name when data_type='character varying' THEN 'varchar('||character_maximum_length||')' when data_type='numeric' THEN 'numeric('||numeric_precision||','||numeric_scale||')' else data_type end as myType from information_schema.columns where table_name='test' 

结果:

 column_name | myType -------------+------------------- test_id | test_domain test_vc | varchar(15) test_n | numeric(15,3) big_n | bigint ip_addr | inet 

从data_schema中提取数据types是可能的,但不方便(需要用case语句连接几个列)。 或者可以使用format_type内置函数来实现,但是它可以在pg_attribute中可见的内部types标识符上工作,但不能在information_schema 。 例

 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 a.attnum > 0 -- hide internal columns AND NOT a.attisdropped -- hide deleted columns AND b.oid = 'my_table'::regclass::oid; -- example way to find pg_class entry for a table 

基于https://gis.stackexchange.com/a/97834