2010-01-27 10 views
90

¿Cómo obtengo el tipo de datos del campo específico de la tabla en postgres? Por ejemplo I tienen la tabla siguiente, student_details ( enteros stu_id, varchar stu_name (30), timestamp JOINED_DATE );Seleccione el tipo de datos del campo en postgres

En esto usando el nombre de campo/o de cualquier otra manera, necesito obtener el tipo de datos del campo específico. Hay alguna posibilidad ?

+0

También se ha pedido y respondido https://stackoverflow.com/q/20194806/65458 –

Respuesta

111

Puede obtener tipos de datos de los information_schema (8,4 documentos referenciados aquí, pero esto no es una característica nueva):

=# 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) 
+0

¡Tan simple y agradable! Ahora puedo reemplazar la consulta actual que encontré que es de 310 caracteres (sin el nombre de la tabla), 4 table join, no es consciente del esquema, es cara y da 'int4' y otros como tipos en lugar de enteros. ¡Gracias! – some

+2

PostgreSQL le permite tener el mismo nombre de tabla (incluso una tabla idéntica) en varios esquemas. La forma robusta de escribir esa cláusula WHERE considera esa posibilidad: 'donde table_catalog =? y table_schema =? y table_name =?; 'Pero esta vista information_schema no considera que DDL podría haber usado [dominios] (http://www.postgresql.org/docs/9.1/static/sql-createdomain.html). –

+0

Esto no le dará el tipo de matriz, por lo que debe usarse junto con 'pg_typeof' – Daria

25

plazo psql -E y luego \d student_details

+0

. Útil si ya está en' psql' y desea utilizar sus comandos. – ShooShoSha

84

Puede utilizar la función pg_typeof(), que también funciona bien para valores arbitrarios.

+3

no funciona si no hay registros en la tabla –

+0

funciona también para hstore – sunki

6

Las vistas del esquema de información y pg_typeof() devuelven información de tipo incompleta. De estas respuestas, psql proporciona la información de tipo más precisa. (La OP podría no necesitar dicha información precisa, pero debe conocer las limitaciones.)

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

Usando psql y \d public.test muestra correctamente el uso del tipo de datos test_domain, la longitud de varchar (n) columnas, y la precisión y escala de columnas numéricas (p, s).

 
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     | 

Esta consulta contra una vista INFORMATION_SCHEMA hace no muestran el uso de test_domain en absoluto. Tampoco informa los detalles de las columnas varchar (n) y numéricas (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 |  data_type 
-------------+------------------- 
test_id  | character varying 
test_vc  | character varying 
test_n  | numeric 
big_n  | bigint 
ip_addr  | inet 

Usted puede ser capaz de obtener toda esa información al unirse a otros puntos de vista INFORMATION_SCHEMA, o mediante la consulta de las tablas del sistema directamente. psql -E podría ayudar con eso.

La función pg_typeof() muestra correctamente el uso de test_domain, pero no informa los detalles de las columnas varchar (n) y numéricas (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 | character varying | numeric | bigint | inet 
5

Si te gusta la solución 'Mike Sherrill', pero no quiere usar psql, que utilizaron esta consulta para obtener la información que falta:

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' 

con resultado:

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

Pruebe esta solicitud:

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

'table_name = 'YOUR_TABLE' AND column_name = 'YOUR_FIELD';' –

0

Es posible, pero no es conveniente, extraer el tipo de datos de information_schema (requiere unir varias columnas con una declaración case).Alternativamente, uno puede usar format_type función incorporada para hacer eso, pero funciona en identificadores de tipo internos que son visibles en pg_attribute pero no en information_schema. Ejemplo

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 

Basado en https://gis.stackexchange.com/a/97834.

Cuestiones relacionadas