Pregunta

¿Cómo consigo tipo de datos de campo específico de la mesa en Postgres? Por ejemplo Tengo la siguiente tabla,   (student_details        número entero stu_id,        varchar stu_name (30),        marca de tiempo JOINED_DATE    );

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

No hay solución correcta

Otros consejos

Usted puede obtener los tipos de datos de la 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)

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

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

ejecutar psql -E y luego \d student_details

Trate de esta solicitud:

SELECT column_name, data_type FROM information_schema.columns WHERE 
table_name = 'YOUR_TABLE' AND column_name = 'YOUR_FIELD';

Si te gusta la solución 'Mike Sherrill', pero no quiere usar psql, que utiliza 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 el resultado:

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

Las vistas de esquema de información y pg_typeof () devuelve información incompleta tipo. De estas respuestas, psql da la información más precisa tipo. (El PO 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
);

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

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 muestra el uso de test_domain en absoluto. También no informa de los detalles de varchar (n) y numérico (p, s) columnas.

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

podría 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.

El pg_typeof() función muestra correctamente el uso de test_domain, pero no informa de los detalles de varchar (n) y numérico (p, s) columnas.

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

Tirando tipo de datos de information_schema es posible, pero no es conveniente (requiere la unión de varias columnas con una declaración case). Alternativamente, se puede utilizar format_type función incorporada de hacer eso, pero funciona en identificadores de tipo interno 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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top