¿Función de metadatos MySQL para obtener el tipo de columna proyectada en la consulta?


7

¿Es posible obtener el tipo de campo de una consulta MySQL , de la misma manera que puede obtenerlo de una tabla con el SHOW COLUMNScomando? Tal como de una tabla derivada,

SELECT x -- presumedMetaFn(x) -- returns "int"
FROM (
  SELECT 1 AS x
  UNION SELECT 2
) AS t;

Dada la consulta anterior, ¿hay una función o algo que pueda usar para obtener el tipo de x? PostgreSQL lo pone a disposición con las funciones de información del sistemapg_typeof

SELECT x, pg_typeof(x)
FROM ( VALUES (1),(2) ) AS t(x);
 x | pg_typeof 
---+-----------
 1 | integer
 2 | integer
(2 rows)

No estoy buscando metadatos en una tabla, sino del resultado de la consulta. Con psqlPostgreSQL 11+, esto también es posible al ejecutar \gdescdespués de la consulta.


Le sugiero que elija esta respuesta: dba.stackexchange.com/a/62262/2639 (que es la única forma de hacerlo dentro del cliente oficial) o mi propia dba.stackexchange.com/a/203927/2639 (que se dirige a la API de C). La respuesta elegida, que aborda solo los enlaces de Perl desde la perspectiva del usuario, parece fuera de tema aquí.
Evan Carroll

Respuestas:


11

Dentro de MySQL, puede obtener esta información creando una tabla temporal y luego utilizando DESCRIBEesa tabla temporal:

CREATE TEMPORARY TABLE `temp`
SELECT ...
FROM ...
LIMIT 0;

DESCRIBE `temp`;

No podemos simplemente usar DESCRIBEen la tabla original porque la columna de la que queremos saber el tipo es una columna calculada, no algo que se extraiga directamente de una tabla. Del mismo modo, no podemos usar DESCRIBEdirectamente en la consulta, porque DESCRIBEsolo se puede usar en tablas. Crear una tabla temporal resuelve ambos problemas.


Esto es exactamente lo que estoy buscando, gracias.
Dean Chiu

3

No hay una forma comparable de entregar una consulta a MySQL y pedirle que devuelva un conjunto de resultados que contenga los nombres y atributos de las columnas que su consulta devolverá cuando se ejecute.

Sin embargo, la biblioteca que está utilizando para acceder a MySQL probablemente tenga un mecanismo que su código podría usar ... porque en el cable, MySQL devuelve esta información a los clientes con cada consulta ejecutada.

A modo de ejemplo, la biblioteca DBD :: mysql en Perl devuelve matrices de nombres de columnas y tipos de datos.

Un controlador de instrucción ejecutado devuelve una matriz de los nombres de columna en @ {$ sth -> {NAME}} y una matriz de los tipos de datos de columna en @ {$ sth -> {mysql_type_name}}. Obtiene estos de las funciones proporcionadas por la API MySQL C, que (que yo sepa) es el mismo código subyacente utilizado por muchos idiomas diferentes para sus bibliotecas MySQL ... por lo que esperaría que estructuras similares se expongan en otros ambientes.


Perl está escribiendo en la API MySQL C a través de XS
Evan Carroll

0

Creo que esta información está disponible a través de C API y está documentada en Códigos de tipo de declaración preparada de C API, pero que el servidor no tiene la capacidad de proporcionarla al usuario final,

El miembro de MYSQL_BINDestructuras buffer_type indica el tipo de datos de la variable de lenguaje C vinculada a un parámetro de declaración o columna de conjunto de resultados. Para la entrada, buffer_typeindica el tipo de la variable que contiene el valor que se enviará al servidor. Para la salida, indica el tipo de variable en la que debe almacenarse un valor recibido del servidor.

Para ver una tabla de los tipos de SQL y el buffer_typevalor correspondiente , consulte este gráfico.

La única solución es CREATE TEMPORARY TABLE AS SELECT (CTAS) ... DESCRIBE


-1

La pregunta, según lo leí, es acerca de obtener detalles sobre las columnas en un conjunto de resultados, a diferencia de las columnas de las tablas de la base de datos.

Si está utilizando PHP, hay funciones integradas para acceder a bases de datos con MYSQLI y PDO que pueden brindarle información detallada (tipo de datos, etc.) sobre las columnas en un resultado de consulta (en oposición a las columnas de las tablas originales) .

Para obtener detalles sobre estos métodos, consulte la documentación de PHP:

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.