CRI*_*ion 14 java mysql database-metadata
运行以下内容时出现语法错误:
show columns from (select * from (select * from my_table) as T)
Run Code Online (Sandbox Code Playgroud)
如何从我编写的查询中显示列,而不是从表中显示?
方法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;
Run Code Online (Sandbox Code Playgroud)
一个重要的一点是传入的查询最后不应该有一个分号.(如果有必要,可以修改存储过程以删除尾随的分号,但我想保持简单.)
这是一个现场演示,展示了它的实际应用: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
Run Code Online (Sandbox Code Playgroud)
上面的缺点是需要手动输入表(和可选的列)名称,而不是在其中显示别名,SELECT但它执行基本工作.它的优点是它不需要用户具有创建临时表的权限,并且可以扩展返回的信息以提供进一步的列信息,例如最大字符长度,数字精度/比例,列注释等.
我正在使用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");
Run Code Online (Sandbox Code Playgroud)
我的表被声明:
CREATE TABLE `MyTable` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
);
Run Code Online (Sandbox Code Playgroud)
我的示例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
Run Code Online (Sandbox Code Playgroud)
除了名称和数据类型之外,您还可以获得有关结果集列的其他信息.有关ResultSetMetaData接口的完整参考文档,请参阅http://docs.oracle.com/javase/8/docs/api/java/sql/ResultSetMetaData.html.
Sac*_*hag -3
尝试这个 -
SHOW COLUMNS FROM (select * from my_table) T
Run Code Online (Sandbox Code Playgroud)
或直接SHOW COLUMNS FROM my_table
| 归档时间: |
|
| 查看次数: |
4996 次 |
| 最近记录: |