【问题标题】:Getting column names from query从查询中获取列名
【发布时间】:2013-08-20 21:28:31
【问题描述】:
考虑一个查询,例如 select a.apple,b.mango,c.orange from A a,B b,C c where ...(某些条件)
这里我只需要根据查询获取列名。
苹果
芒果
橙色。
我们有一个查询构建器,最终用户可以使用它创建/生成任何类型的查询,我的职责是只从上面的查询中选择列名以进行进一步的操作。
我如何通过 java 代码或查询来实现这一点?
我的数据库是 sql server 2005。
【问题讨论】:
标签:
java
sql
sql-server-2005
【解决方案1】:
获取ResultSetMetaData java接口
PreparedStatement ps=con.prepareStatement("select * from your_table_name");
ResultSet rs=ps.executeQuery();
ResultSetMetaData rsmd=rs.getMetaData();
System.out.println("Total columns: "+rsmd.getColumnCount());
System.out.println("Column Name of 1st column: "+rsmd.getColumnName(1));
con.close();
【解决方案2】:
如果您只需要显示您已经知道的列名,您可以简单地将它们(列名)直接放入 SELECT 列表中:
SELECT apple AS apple ,mango AS mango,orange AS orange
否则可以查询SQL Server的信息架构服务表:
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=OBJECT_NAME(OBJECT_ID('a')) OR TABLE_NAME=OBJECT_NAME(OBJECT_ID('b')) OR TABLE_NAME=OBJECT_NAME(OBJECT_ID('c'))
使用 Java 并从原始查询中,您可以使用 ResultSetMetaData 对象读取列名:
ResultSetMetaData rsmd = rs.getMetaData();
String apple = rsmd.getColumnName(1); //Column apple
String mango = rsmd.getColumnName(2);
【解决方案3】:
【讨论】:
-
How to Answer: 为链接提供上下文 - 始终欢迎提供潜在解决方案的链接,但请在链接周围添加上下文,以便您的其他用户了解什么它是,为什么它在那里。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
-
【解决方案4】:
我找到了一个解决方案,它工作正常。感谢大家花费宝贵的时间。
我们可以通过两种方式实现这一点。
- 通过地图。
例如:
List> lsMapStringObj = new ArrayList>();
for(Map myMap: lsMapStringObj)
{
for (Map.Entry 条目:myMap.entrySet())
{
lsRsult.add(entry.getKey());
}
}
但是如果查询返回 > 0 行,那么只有我可以获取列名。
-
这给出了我期望的解决方案(>= 0 行)
PreparedStatement ps=con.prepareStatement(sQuery);
结果集 rs=ps.executeQuery();
ResultSetMetaData rsmd=rs.getMetaData();
int numColumns = rsmd.getColumnCount();
for (int i = 1; i
{
lsResult.add(rsmd.getColumnName(i));
}
返回 lsResult;
终于搞定了,希望对大家有帮助。享受编程……!!!
【解决方案5】:
一种更简单的解决方案是使用 String.split 标记列名。它将返回一个 columnNames 数组。
String query = "select a.apple,b.mango,c.orange from A a,B b,C c where ... (Some conditions)";
String[] columnNames= query.split(" [fF][rR][oO][mM] ")[0]
.split("[ ]*[sS][eE][lL][eE][cC][tT] ")[1]
.split("[ ]*,[ ]*");
for(int i=0; i<columnNames.length;i++){
System.out.println(i+".)"+columnNames[i]);
}
输出:
{a.apple,b.mango,c.orange} //String array
//Sysout
1.)a.apple
2.)b.mango
3.)c.orange