Подтвердить что ты не робот

Как показать COLUMNS из запроса SELECT (а не таблицы)?

Я получаю синтаксическую ошибку, когда запускаю следующее:

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

Как я могу показать столбцы из запроса, который я написал, а не из таблицы?

4b9b3361

Ответ 1

МЕТОД 1: Временная таблица

Ответы, уже опубликованные об использовании временной таблицы, обычно будут наиболее подходящим решением. Но есть важный момент, что если запрос выполняется как есть, все соединения и т.д. Будут обработаны, что потенциально может занять много времени в некоторых случаях. К счастью, MySQL позволяет LIMIT 0 не возвращать строки, а документация утверждает, что это "быстро возвращает пустой набор". Следующая хранимая процедура выполнит это задание для вас, взяв строку запроса SQL в качестве входных данных, обернув ее с помощью LIMIT 0, запустив динамический запрос для создания временной таблицы и затем показывая ее столбцы:

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;

Одним из важных моментов является то, что запрос, который должен пройти, не должен содержать точку с запятой в конце. (При необходимости хранимая процедура может быть изменена для удаления конечных полуколоней, но я хотел бы сохранить ее простой.)

Вот живая демонстрация, показывающая ее в действии: http://rextester.com/NVWY58430

МЕТОД 2: ИНФОРМАЦИЯ_SCHEMA.COLUMNS

Такую же информацию, возвращаемую SHOW COLUMNS, можно также получить непосредственно из таблицы 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

Вышеупомянутые недостатки требуют, чтобы имена таблиц (и необязательных столбцов) вводились вручную и не отображали псевдонимы в SELECT, но выполняли основное задание. Его преимущества заключаются в том, что пользователю не требуется разрешение на создание временной таблицы, и возвращаемая информация может быть расширена для обеспечения дополнительной информации о столбцах, такой как максимальная длина символа, числовая точность/масштаб, комментарии столбца и т.д.

Ответ 2

Я использую Java для извлечения столбцов из запроса MySql.

Лучший способ в Java получить информацию о столбцах для набора результатов - использовать интерфейс 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");

Объявлена ​​моя таблица:

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

Вывод моего примера кода Java:

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

Вы можете получить другую информацию о столбцах набора результатов помимо их имен и типов данных. См. http://docs.oracle.com/javase/8/docs/api/java/sql/ResultSetMetaData.html для полных справочных документов в интерфейсе ResultSetMetaData.

Ответ 3

Похоже, что этот оператор принимает только существующие таблицы.

Итак, я создал новую временную таблицу с моим запросом и получил там имена столбцов.

/*if the exporting table was created before, then delete it*/
DROP TABLE IF EXISTS exportTable;

/*create the temporary table (check if you have mySQL permission to do so)*/
CREATE TEMPORARY TABLE exportTable AS (your_query);

/*get result table (this is a table, the columns names are in the first column of this table ['Field'])*/
SHOW COLUMNS FROM exportTable;

Временная таблица создается в контексте сеанса и будет удалена, когда сеанс будет закрыт. То же самое для таблицы SHOW COLUMNS. Вы можете рассмотреть влияние этих созданий таблиц на серверный диск.

Вы можете использовать ключевое слово TEMPORARY при создании таблицы. Таблица TEMPORARY видна только для текущего сеанса и автоматически отбрасывается при закрытии сеанса. Это означает, что два разных сеанса могут использовать одно и то же имя временной таблицы без конфликта друг с другом или с существующим не-ВРЕМЕННАЯ таблица с тем же именем. (Существующая таблица скрыта до тех пор, пока временная таблица не будет удалена.) Чтобы создать временные таблицы, вы должны иметь привилегию CREATE TEMPORARY TABLES.

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

Ответ 4

попробуйте это -

SHOW COLUMNS FROM (select * from my_table) T

или Непосредственно SHOW COLUMNS FROM my_table