2011-03-25 93 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

相关问题