Funzione di metadati MySQL per ottenere il tipo di colonna proiettata nella query?


7

È possibile ottenere il tipo di campo da una query MySQL , allo stesso modo in cui è possibile ottenerlo da una tabella con il SHOW COLUMNScomando? Come da una tabella derivata,

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

Data la query sopra, c'è una funzione o qualcosa che posso usare per ottenere il tipo di x? PostgreSQL lo rende disponibile con le funzioni di informazioni di sistemapg_typeof

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

Non sto cercando metadati su una tabella, ma dal risultato della query. Con psqlPostgreSQL 11+, ciò è possibile anche eseguendo \gdescla query.


Consiglio vivamente di scegliere questa risposta: dba.stackexchange.com/a/62262/2639 (che è l'unico modo per farlo all'interno del cliente ufficiale) o il mio dba.stackexchange.com/a/203927/2639 (che si rivolge all'API C). La risposta scelta, indirizzando solo i collegamenti Perl dal punto di vista dell'utente, sembra fuori tema qui.
Evan Carroll,

Risposte:


11

All'interno di MySQL, puoi ottenere queste informazioni creando una tabella temporanea, quindi utilizzando DESCRIBEsu quella tabella temporanea:

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

DESCRIBE `temp`;

Non possiamo semplicemente usare DESCRIBEsulla tabella originale perché la colonna di cui vogliamo sapere il tipo è una colonna calcolata, non qualcosa che viene estratto direttamente da una tabella. Allo stesso modo, non possiamo utilizzare DESCRIBEdirettamente sulla query, perché DESCRIBEpuò essere utilizzato solo sulle tabelle. La creazione di una tabella temporanea risolve entrambi questi problemi.


Questo è esattamente quello che sto cercando, grazie.
Decano Chiu,

3

Non esiste un modo analogo per consegnare una query a MySQL e chiederle di restituire un set di risultati contenente i nomi e gli attributi delle colonne che la query restituirà quando viene eseguita.

Tuttavia, la libreria che stai usando per accedere a MySQL ha probabilmente un meccanismo tale che il tuo codice potrebbe usare ... perché sul filo, MySQL restituisce queste informazioni ai client con ogni query eseguita.

A titolo di esempio, la libreria DBD :: mysql in Perl restituisce matrici di nomi di colonne e tipi di dati.

Un handle di istruzione eseguito restituisce una matrice dei nomi di colonna in @ {$ sth -> {NAME}} e una matrice dei tipi di dati di colonna in @ {$ sth -> {mysql_type_name}}. Le ottiene dalle funzioni fornite dall'API MySQL C, che (per quanto ne so) è lo stesso codice sottostante utilizzato da molte lingue diverse per le loro librerie MySQL ... quindi mi aspetto che strutture simili vengano esposte in altri ambienti.



0

Ritengo che questi dati siano disponibili tramite l' API C e documentati nei codici del tipo di dichiarazione preparati dell'API C ma che il server non abbia tale capacità di fornirli all'utente finale,

Il membro buffer_type delle MYSQL_BINDstrutture indica il tipo di dati della variabile del linguaggio C associato a un parametro di istruzione o colonna del set di risultati. Per input, buffer_typeindica il tipo di variabile contenente il valore da inviare al server. Per l'output, indica il tipo di variabile in cui deve essere memorizzato un valore ricevuto dal server.

Per una tabella dei tipi SQL e il buffer_typevalore corrispondente , vedere questo grafico.

L'unica soluzione è CREATE TEMPORARY TABLE AS SELECT (CTAS) ... DESCRIBE


-1

La domanda, come ho letto, riguarda l'ottenimento di dettagli sulle colonne in un gruppo di risultati, al contrario delle colonne delle tabelle del database.

Se stai usando PHP, ci sono funzioni integrate per accedere ai database con MYSQLI e PDO che possono darti informazioni dettagliate (tipo di dati e così via) sulle colonne in un risultato della query (al contrario delle colonne delle tabelle originali) .

Per i dettagli su questi metodi, consultare la documentazione di PHP:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.