2010-09-15 15 views
12

je reçois une erreur de syntaxe lorsque j'exécutez la commande suivante:Comment afficher COLUMNS à partir d'une requête SELECT (plutôt que d'une table)?

show columns from (select * from (select * from my_table) as T) 

Comment puis-je afficher les colonnes d'une requête que j'ai écrit, plutôt que d'une table?

+0

Voulez-vous simplement récupérer les colonnes associées à une table et leurs informations correspondantes? –

+0

OUI mais à partir de la requête dynamique, pas à partir du TABLEAU –

+3

Il existe des API permettant d'extraire des métadonnées à propos d'un ensemble de résultats. Quel environnement de langage de programmation utilisez-vous? Il devrait y avoir des solutions pour la plupart des langues, mais pour donner un exemple, je devrais savoir lequel vous utilisez. –

Répondre

-1

try this -

SHOW COLUMNS FROM (select * from my_table) T 

ou directement SHOW COLUMNS FROM my_table

+4

Je ne peux pas lancer cette requête 'SHOW COLUMNS FROM (sélectionnez * from my_table) T' semble avoir une erreur. – Mavichow

+1

@Sachin, Mec cela ne fonctionne pas: 'SHOW COLUMNS FROM (sélectionnez * from my_table) T' – Pacerier

4

On dirait que cette déclaration accepte uniquement les tables existantes.

J'ai donc créé une nouvelle table temporaire avec ma requête et j'ai obtenu les noms de colonnes à partir de là. La table temporaire est créée dans le contexte de la session et sera supprimée à la fermeture de la session. La table temporaire est créée dans le contexte de la session. La même chose est pour la table SHOW COLUMNS. Vous pouvez considérer l'impact de ces créations de table sur le disque du serveur.

Vous pouvez utiliser le mot clé TEMPORARY lors de la création d'une table. Une table TEMPORARY est visible uniquement pour la session en cours et est supprimée automatiquement lorsque la session est fermée. Cela signifie que deux sessions différentes peuvent utiliser le même nom de table temporaire sans conflit entre elles ou avec une table non-TEMPORARY existante du même nom. (La table existante est masquée jusqu'à ce que la table temporaire soit supprimée.) Pour créer des tables temporaires, vous devez disposer du privilège CREATE TEMPORARY TABLES.

http://dev.mysql.com/doc/refman/5.7/en/create-table.html

5

MÉTHODE 1: table temporaire

Les réponses déjà affichées sur l'utilisation d'une table temporaire sera généralement la solution la plus appropriée. Mais il est important de noter que si la requête est exécutée telle quelle, toutes les jointures etc. seront traitées, ce qui peut prendre du temps dans certains cas. Heureusement, MySQL permet LIMIT 0 de ne renvoyer aucune ligne et le documentation indique que cela "renvoie rapidement un ensemble vide". La procédure stockée suivante fera ce travail pour vous en prenant une chaîne de requête SQL en entrée, l'enveloppant avec LIMIT 0, exécution de la requête dynamique pour produire une table temporaire, puis montrant ses colonnes:

CREATE PROCEDURE showColumns(IN sqlToShow TEXT) 
BEGIN 
    DROP TEMPORARY TABLE IF EXISTS tempTable; 
    SET @sqlLimit0 = CONCAT('CREATE TEMPORARY TABLE tempTable AS (SELECT * FROM (', 
          sqlToShow, ') subq LIMIT 0)'); 
    PREPARE stmt FROM @sqlLimit0; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
    SHOW COLUMNS FROM tempTable; 
END; 

Un point important est la requête transmise ne devrait pas avoir de point-virgule à la fin. (Si nécessaire, la procédure stockée pourrait être modifiée pour enlever arrière des points-virgules, mais je voulais garder les choses simples.)

Voici une démonstration en direct montrant en action: http://rextester.com/NVWY58430

MÉTHODE 2: INFORMATION_SCHEMA.COLONNES

Les mêmes informations renvoyées par SHOW COLUMNS peuvent également être obtenus directement à partir de la table INFORMATION_SCHEMA.COLUMNS:

SELECT TABLE_NAME AS `Table`, 
     COLUMN_NAME AS `Field`, 
     COLUMN_TYPE AS `Type`, 
     IS_NULLABLE AS `Null`, 
     COLUMN_KEY AS `Key`, 
     COLUMN_DEFAULT AS `Default`, 
     EXTRA AS `Extra` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA` = SCHEMA() -- This uses the current schema 
    AND `TABLE_NAME` IN ('table1', 'table2', 'etc.'); 
    -- ...or could go even further and restrict to particular columns in tables if desired 

Les ci-dessus présente les inconvénients de nécessiter la table des noms (et la colonne éventuellement) pour être saisies manuellement et ne montre pas les noms d'alias dans le SELECT mais il fait le travail de base. Ses avantages sont qu'il ne nécessite pas l'autorisation de créer une table temporaire et que les informations renvoyées peuvent être étendues pour fournir d'autres informations sur les colonnes telles que la longueur maximale des caractères, la précision/échelle numérique, les commentaires de colonne, etc ...

+0

il fonctionne avec une base de données spécifique comme il ne fonctionnerait pas pour la base de données de cache intersystem –

+0

La question est pour MySQL - s'il vous plaît voir les balises ci-dessous il. –

5

J'utilise Java pour récupérer des colonnes de la requête MySql.

La meilleure façon en Java pour obtenir des informations de colonne pour un ensemble de résultats est d'utiliser l'interface ResultSetMetaData:

PreparedStatement stmt = null; 
ResultSet result = null; 
ResultSetMetaData meta = null; 

try { 
    stmt = con.prepareStatement("SELECT * FROM MyTable"); 
    result = stmt.executeQuery(); 
} catch (SQLException e) { 
    System.out.println("SQLException: "+e.getMessage()); 
    System.exit(1); 
} 
System.out.println("Successful query"); 

try { 
    meta = result.getMetaData(); 
    System.out.println("Total columns: " + meta.getColumnCount()); 
    System.out.println("Name of column 1: " + meta.getColumnName(1)); 
    System.out.println("Type of column 1: " + meta.getColumnTypeName(1)); 

    System.out.println("Name of column 2: " + meta.getColumnName(2)); 
    System.out.println("Type of column 2: " + meta.getColumnTypeName(2)); 
} catch (SQLException e) { 
    System.out.println("SQLException: "+e.getMessage()); 
    System.exit(1); 
} 
System.out.println("Successful metadata report"); 

Ma table est déclarée:

CREATE TABLE `MyTable` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
); 

sortie de mon exemple Java code:

Successful query 
Total columns: 2 
Name of column 1: id 
Type of column 1: BIGINT UNSIGNED 
Name of column 2: name 
Type of column 2: VARCHAR 
Successful metadata report 

Vous pouvez obtenir d'autres informations sur les colonnes de l'ensemble de résultats en plus de leurs noms et types de données. Voir http://docs.oracle.com/javase/8/docs/api/java/sql/ResultSetMetaData.html pour les documents de référence complets sur l'interface ResultSetMetaData.