¿Existe una consulta o comando de PostgreSQL que devuelve los nombres de campo y los tipos de campo de una consulta, tabla o vista?
Por ejemplo, una solución si se aplica a una consulta SELECT simple como SELECT * from person
debería devolver una lista como:
Column Name | Column Type
===========================
First Name | character
Last Name | character
Age | integer
Date of Birth | date
He buscado las information_schema
vistas descritas en una respuesta a continuación y parece cubrir bastante bien las tablas, y sospecho que también cubre las vistas, pero aún no lo he comprobado.
La última es arbitraria, sino que cualquier válido por ejemplo, consulta SELECT que implica, JOINS
, UNIONS
etc, en la base de datos. ¿Existe un procedimiento incorporado u otro procedimiento almacenado o secuencia de comandos que pueda devolver lo mismo para cualquier CONSULTA válida?
Estoy desarrollando un programa que crea datos y formularios de consulta y la información es necesaria para la validación de datos y la ejecución de funciones en los datos devueltos.
fuente
SELECT
, las consultas, es decir, consultas, es decir, consultas que no definen datos o manipulan datos, ya sea en tablas, vistas u otras consultas, devuelven filas y columnas de datos, por lo que PostgreSQL debería poder devolver un lista de los nombres de columna y sus tipos de datos. Lasinformation_schema
vistas mencionadas a continuación en las respuestas parecen responder a las tablas y vistas. Las consultas arbitrarias SELECT son la frontera final.Respuestas:
Esquema de información vs. catálogos del sistema
Hemos tenido discusiones sobre esto muchas veces. El esquema de información sirve para ciertos propósitos. Si conoce los catálogos del sistema, estos sirven mejor para la mayoría de los propósitos , IMO. Los catálogos del sistema son la fuente real de toda la información.
El esquema de información proporciona vistas estandarizadas que ayudan con la portabilidad, principalmente en las principales versiones de Postgres, porque la portabilidad en diferentes plataformas RDBMS generalmente es una ilusión una vez que sus consultas son lo suficientemente sofisticadas como para necesitar buscar catálogos de sistemas. Y, en particular, Oracle todavía no es compatible con el esquema de información.
Las vistas en el esquema de información deben saltar a través de muchos aros para lograr un formato que cumpla con el estándar. Esto los hace lentos, a veces muy lentos. Compare los planes y el rendimiento de estos objetos básicos:
La diferencia es notable. Realmente depende de lo que estés buscando.
Su ejemplo
Para su ejemplo
SELECT * from tbl
, compare las dos consultas a continuación para esta tabla simple:Utilizando
pg_attribute
:format_type()
devuelve el tipo completo con todos los modificadores:También tenga en cuenta que el reparto para
regclass
resuelve el nombre de la tabla de manera algo inteligente de acuerdo con el actualsearch_path
. También genera una excepción si el nombre no es válido. Detalles:Utilizando
information_schema.columns
:La información está estandarizada, pero incompleta :
Para obtener información completa sobre el tipo de datos, debe considerar todas estas columnas además:
Respuestas relacionadas:
Una lista de pros y contras , los mayores pros (IMO) en negrita:
Vistas del esquema de información
Catálogos del sistema
oid
incluidas)Consulta arbitraria
Para obtener la misma lista de nombres y tipos de columnas de una consulta, puede usar un simple truco: CREAR una tabla temporal a partir de la salida de la consulta, luego use las mismas técnicas que anteriormente.
Puede agregar
LIMIT 0
, ya que no necesita datos reales:Para obtener el tipo de datos de columnas individuales, también puede usar la función
pg_typeof()
:fuente
Puede usar el
psql
cliente de línea de comando.\dt
mostrará una lista de tablas\dv
mostrará una lista de vistas\d [object_name]
describirá el esquema de la tabla o vistaSin embargo, no estoy seguro de cómo describiría una consulta.
Más información: https://manikandanmv.wordpress.com/tag/basic-psql-commands/
fuente
Si tiene acceso al pg_catalog y usa PgAdmin3, le recomiendo una solución que encontré en el blog de Valentine's Tech ( http://tech.valgog.com/2011/02/pgadmin-iii-macros-get-table-fields. html ) Es una macro PgAdmin3 a la que se puede acceder con un acceso directo para mostrar la definición de un nombre de tabla seleccionado.
Funciona como un encanto y extremadamente útil.
fuente
Use las
information_schema
vistas , son estándar SQL y contienen la información que desea.Usted puede también directamente el acceso
pg_class
,pg_attribute
etc, pero eso es no portables y con frecuencia fiddlier; es posible que tenga funciones de ayuda comooidvectortypes
,pg_get_function_arguments
, etc para algunas cosas.Si desea ver cómo se
psql
ejecuta algo así\dt
, ejecutepsql -E
: imprimirá la consulta. Sin embargo, generalmente es mejor usar elinformation_schema
si satisface sus necesidades.fuente
Esto puede ser demasiado simple, pero pgAdmin4 muestra los tipos de campo en los resultados de salida. Las otras soluciones anteriores son probablemente más elegantes, pero cuando solo necesito una respuesta rápida, encuentro que la GUI de consulta de pgAdmin4 funciona bastante bien. Intentar averiguar el tipo de campo de un campo calculado devuelto por una vista o función puede ser complicado.
fuente