Seleccione el tipo de datos del campo en postgres
-
23-09-2019 - |
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 .