如何从Postgres中的表中获取特定字段的数据类型?例如,我有下表,student_details(stu_id整数,stu_name varchar(30),joind_date时间戳);
在使用字段名称/或任何其他方式时,我需要获取特定字段的数据类型。有没有可能?
如何从Postgres中的表中获取特定字段的数据类型?例如,我有下表,student_details(stu_id整数,stu_name varchar(30),joind_date时间戳);
在使用字段名称/或任何其他方式时,我需要获取特定字段的数据类型。有没有可能?
Answers:
您可以从information_schema(此处引用的8.4文档,但这不是新功能)中获取数据类型:
=# 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)
where table_catalog = ? and table_schema = ? and table_name = ?;
但是,此information_schema视图并不认为DDL可能已使用domains。
pg_typeof
您可以使用pg_typeof()函数,该函数也可用于任意值。
SELECT pg_typeof("stu_id"), pg_typeof(100) from student_details limit 1;
SELECT pg_typeof( date_part( 'year', now() ) ) AS expr
可能与您期望的有所不同。
pg_typeof
适用于来自存储过程的字段,对于这些字段,后端表(甚至存在)尚不知道/不清楚。 select state, qstart, pg_typeof(qstart) as ty_qstart from listconn()
。information_schema在这里无济于事。
如果您喜欢“ Mike Sherrill”解决方案,但不想使用psql,则可以使用此查询获取缺少的信息:
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
信息模式视图和pg_typeof()返回不完整的类型信息。在这些答案中,psql
给出最精确的类型信息。(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
正确显示数据类型的使用,test_domain
varchar(n)列的长度以及numeric(p,s)列的精度和小数位数。
sandbox =#\ d public.test 表“ public.test” 专栏 类型 修饰符 --------- + ----------------------- + ----------- 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 | 数据类型 ------------- + ------------------- test_id | 角色变化 test_vc | 角色变化 test_n | 数字 big_n | 比金特 ip_addr | et
您可以通过加入其他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 | et
information_schema
可以从中拉取数据类型,但不方便(需要使用一条case
语句连接多个列)。或者,可以使用format_type
内置函数来执行此操作,但是它可以对中可见pg_attribute
但不可见的内部类型标识符起作用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
b.relfilenode
为b.oid