Как ПОКАЗАТЬ КОЛОННЫ из запроса SELECT (а не из таблицы)? - PullRequest
14 голосов
/ 15 сентября 2010

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

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

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

Ответы [ 4 ]

7 голосов
/ 03 ноября 2016

МЕТОД 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: INFORMATION_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, но они выполняют основную работу. Его преимущества заключаются в том, что пользователю не требуется разрешение на создание временной таблицы, а возвращаемая информация может быть расширена для предоставления дополнительной информации о столбце, такой как максимальная длина символа, числовая точность / масштаб, комментарии к столбцу и т. Д.

5 голосов
/ 08 ноября 2016

Я использую 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.

4 голосов
/ 07 августа 2016

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

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

/*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 при создании таблицы. ВРЕМЕННАЯ таблица видна только текущему сеансу и автоматически удаляется при закрытии сеанса. Это означает, что два разных сеанса могут использовать одно и то же имя временной таблицы, не конфликтуя друг с другом или с существующим-Временная таблица с тем же именем.(Существующая таблица скрыта до тех пор, пока временная таблица не будет удалена.) Для создания временных таблиц необходимо обладать привилегией CREATE TEMPORARY TABLES.

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

0 голосов
/ 15 сентября 2010

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

SHOW COLUMNS FROM (select * from my_table) T

или напрямую SHOW COLUMNS FROM my_table

...