Fonction de métadonnées MySQL pour obtenir le type de colonne projeté dans la requête?

7

Est-il possible d'obtenir le type de champ à partir d'une requête MySQL , de la même manière que vous pouvez l'obtenir à partir d'une table avec la SHOW COLUMNScommande? Comme à partir d'une table dérivée,

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

Compte tenu de la requête ci-dessus, existe-t-il une fonction ou quelque chose que je peux utiliser pour obtenir le type de x? PostgreSQL le rend disponible avec les fonctions d'informations systèmepg_typeof

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

Je ne cherche pas de métadonnées sur une table, mais à partir du résultat de la requête. Avec psqlPostgreSQL 11+, cela est également possible en exécutant \gdescaprès la requête.

j'ai un ordinateur
la source
Je vous suggère fortement de choisir cette réponse: dba.stackexchange.com/a/62262/2639 (qui est la seule façon de le faire au sein du client officiel) ou mon propre dba.stackexchange.com/a/203927/2639 (qui adresse l'API C). La réponse choisie, ne traitant que les liaisons Perl du point de vue de l'utilisateur, semble hors sujet ici.
Evan Carroll

Réponses:

11

Dans MySQL, vous pouvez obtenir ces informations en créant une table temporaire, puis en utilisant DESCRIBEsur cette table temporaire:

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

DESCRIBE `temp`;

Nous ne pouvons pas simplement utiliser DESCRIBEsur la table d'origine, car la colonne dont nous voulons connaître le type est une colonne calculée, pas quelque chose qui est directement extrait d'une table. De même, nous ne pouvons pas utiliser DESCRIBEdirectement sur la requête, car DESCRIBEils ne peuvent être utilisés que sur des tables. La création d'une table temporaire résout ces deux problèmes.

Brilliand
la source
C'est exactement ce que je recherche, merci.
Dean Chiu
3

Il n'y a pas de moyen comparable de transmettre une requête à MySQL et de lui demander de renvoyer un jeu de résultats contenant les noms et les attributs des colonnes que votre requête retournera lors de son exécution.

Cependant, la bibliothèque que vous utilisez pour accéder à MySQL dispose probablement d'un tel mécanisme que votre code pourrait utiliser ... car sur le fil, MySQL renvoie ces informations aux clients à chaque requête exécutée.

À titre d'exemple, la bibliothèque DBD :: mysql en Perl renvoie des tableaux de noms de colonnes et de types de données.

Un descripteur d'instruction exécuté renvoie un tableau des noms de colonne dans @ {$ sth -> {NAME}} et un tableau des types de données de colonne dans @ {$ sth -> {mysql_type_name}}. Il les obtient à partir des fonctions fournies par l'API MySQL C, qui (pour autant que je sache) est le même code sous-jacent utilisé par de nombreux langages différents pour leurs bibliothèques MySQL ... donc je m'attendrais à ce que des structures similaires soient exposées dans d'autres environnements.

Michael - sqlbot
la source
Perl tape dans l' API MySQL C via XS
Evan Carroll
0

Je pense que ces données sont disponibles via l' API C et documentées dans les codes de type de déclaration préparés par l'API C, mais que le serveur n'a pas la capacité de les fournir à l'utilisateur final,

Le membre buffer_type des MYSQL_BINDstructures indique le type de données de la variable de langage C lié à un paramètre d'instruction ou à une colonne d'ensemble de résultats. Pour l'entrée, buffer_typeindique le type de la variable contenant la valeur à envoyer au serveur. Pour la sortie, il indique le type de la variable dans laquelle une valeur reçue du serveur doit être stockée.

Pour un tableau des types SQL et la buffer_typevaleur correspondante , voir ce graphique.

La seule solution consiste à CREATE TEMPORARY TABLE AS SELECT (CTAS) ... DESCRIBE

Evan Carroll
la source
-1

La question, comme je l'ai lu, concerne l'obtention de détails sur les colonnes d'un ensemble de résultats, par opposition aux colonnes des tables de base de données.

Si vous utilisez PHP, il existe des fonctions intégrées pour accéder aux bases de données avec MYSQLI et PDO qui peuvent vous donner des informations détaillées (type de données, etc.) sur les colonnes dans un résultat de requête (par opposition aux colonnes des tables d'origine) .

Pour plus de détails sur ces méthodes, consultez la documentation PHP:

vidona
la source