2010-09-15 28 views
12

我得到一個語法錯誤,當我運行以下命令:如何從SELECT查詢(而不是表格)顯示COLUMNS?

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

我如何可以顯示從我寫的,而不是從一個表的查詢中的列?

+0

你只是想檢索與表格及其相應信息相關的列? – 2010-09-15 10:01:48

+0

是,但是來自動態查詢,而不是來自TABLE – 2010-09-16 04:10:15

+3

有API用於獲取有關結果集的元數據。你使用什麼編程語言環境?對於大多數語言應該有解決方案,但要提供一個示例,我需要知道您使用的是哪一種。 – 2016-11-03 14:52:47

回答

-1

試試這個 -

SHOW COLUMNS FROM (select * from my_table) T 

,或者直接SHOW COLUMNS FROM my_table

+4

我無法運行此查詢'SHOW COLUMNS FROM(select * from my_table)T'似乎有錯誤。 – Mavichow 2014-10-23 03:59:25

+1

@Sachin,Dude這不起作用:'SHOW COLUMNS FROM(select * from my_table)T' – Pacerier 2015-05-10 07:45:06

4

貌似這個語句只接受現有的表。

因此,我用我的查詢創建了一個新的臨時表,並從那裏獲得了列名。

/*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表僅對當前會話可見,並在會話關閉時自動刪除。這意味着兩個不同的會話可以使用相同的臨時表名稱而不會相互衝突,或者與同名的現有非TEMPORARY表衝突。 (直到臨時表被刪除時,現有表纔會隱藏。)要創建臨時表,您必須具有CREATE TEMPORARY TABLES特權。

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

5

方法1:臨時表

的答案已經發布了關於使用臨時表通常是最合適的解決方案。但重要的一點是,如果查詢按原樣運行,則會處理所有連接等,這在某些情況下可能需要很長時間。幸運的是,MySQL允許LIMIT 0不返回任何行,documentation指出這個「快速返回一個空集」。

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; 

很重要的一點是:下面的存儲過程將採取一個SQL查詢字符串作爲輸入,與LIMIT 0包裹它,運行動態查詢產生一個臨時表,然後顯示其列做這個工作適合你傳入的查詢最後不應該有分號。 (如果必要的話,存儲過程可以被修改,以刪除尾隨分號,但我想保持簡單。)

這裏是表示動作是現場演示: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中顯示別名,但它完成了基本工作。它的優點是它不需要用戶有權創建臨時表,並且可以擴展返回的信息以提供進一步的列信息,例如最大字符長度,數字精度/比例,列註釋等。

+0

它適用於特定的數據庫,因此它不適用於系統間緩存數據庫 – 2016-11-08 09:17:24

+0

問題在於MySQL - 請參閱下面的標籤它。 – 2016-11-08 09:24:07

5

我正在使用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`) 
); 

我的例子中爪哇輸出代碼:

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 

除了名稱和數據類型之外,您還可以獲得有關結果集列的其他信息。有關ResultSetMetaData接口的完整參考文檔,請參閱http://docs.oracle.com/javase/8/docs/api/java/sql/ResultSetMetaData.html