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