2011-03-25 47 views
0

我正在創建一個實用程序,它允許用戶輸入SQL查詢以將數據導入到我的數據庫。如何才能獲得給定的mysql查詢的列名稱?

第一步是顯示結果字段的列表,以便用戶可以將它們路由到目標字段。

當用戶從MSSQL導入時,我可以使用SET FMTONLY ON來獲取查詢在運行時會產生的輸出列的列表(假設查詢首先有效)。

我一直無法找到一種方法來做到這一點的MySQL。 EXPLAIN未列出生成的字段。


考慮以下查詢:

SELECT CONCATENATE(first_name, " ", last_name) AS name, age, foo 
FROM customers 
ORDER BY name ASC; 

我最終需要得到只輸出字段列表,像這樣:

{ "name", "age", "foo" } 

我怎樣才能做到這一點在MySQL?

+0

SQL Server方法:http://stackoverflow.com/questions/3777046/how-to-list-all-columns-of-a-given-sql-query/3777086#3777086 – JYelton 2011-03-25 23:08:30

回答

3

SET FMTONLY ON還是需要您手動得到列名和類型,它只是產生一個空的結果集。

對於MySQL,添加一個WHERE FALSE地方

SELECT CONCATENATE(first_name, " ", last_name) AS name, age, foo 
FROM customers 
WHERE FALSE 
ORDER BY name ASC; 

你得到這個可愛的執行計劃

「ID」, 「SELECT_TYPE」, 「表」, 「類型」; 「possible_keys」 ; 「鍵」, 「key_len」; 「REF」, 「行」; 「Extra」
「1」;「SIMPLE」; NULL; NULL; NULL; NULL; NULL; NULL; NULL; 「不可能WHERE」

然後解析列,你會set fmtonly on與MSSQL


對於複雜的查詢(嵌套,組通過,限制-ED),它包裝在一個子查詢

select * from (
    <your wonderful brilliant complex query> 
) x where false 

如果內部查詢包含沒有TOP的ORDER BY,MSSQL會抱怨,MySQL可以。

+0

+1這很簡單,但有一個問題:如何最好地將WHERE FALSE添加到可能已經有幾個WHERE子句並以ORDER或GROUP指令結束的查詢字符串中。 。一些聰明的字符串解析當然是可能的。 – JYelton 2011-03-25 23:16:13

+0

@JYelton - 好點,回答更新。當然,如果你的查詢以終止符''結尾;''將它從子查詢中刪除! – RichardTheKiwi 2011-03-25 23:19:44

+0

非常好,那會工作。 – JYelton 2011-03-25 23:23:50

0

我認爲你正在尋找DESC {} table_name的

+0

這將是如果用戶只是選擇了一個表並想將其字段路由到目標數據庫。我正在尋找一種方法來評估可能已經執行表連接,重命名字段或完全忽略字段的查詢。 – JYelton 2011-03-25 23:13:31

1

我認爲你需要看看resultsetmetada。我攜帶了列數,列名以及更多關於結果集的內容。

+0

執行查詢肯定會給我列;我希望在查詢需要很長時間的情況下避免出現這種情況。 – JYelton 2011-03-25 23:18:28

+0

@JYelton你不必執行查詢,只需準備它。 – Neil 2011-03-25 23:38:23

相關問題