java - 如何从 SELECT 查询(而不是表)中显示列?

标签 java mysql database-metadata

运行以下命令时出现语法错误:

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

如何显示我编写的查询而不是表中的列?

最佳答案

方法一:临时表

已经发布的关于使用临时表的答案通常是最合适的解决方案。但有一点很重要,如果查询按原样运行,所有连接等都将被处理,这在某些情况下可能需要很长时间。幸运的是,MySQL 允许 LIMIT 0 不返回任何行,并且 documentation指出这“快速返回一个空集”。以下存储过程将通过将 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;

重要的一点是传入的查询不应该在末尾有分号。 (如有必要,可以修改存储过程以删除结尾的分号,但我想保持简单。)

这是一个现场演示,展示了它的实际效果: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 中显示别名,但它完成了基本工作。它的优点是不需要用户有创建临时表的权限,并且返回的信息可以扩展以提供进一步的列信息,例如最大字符长度、数字精度/小数位数、列注释等。

关于java - 如何从 SELECT 查询(而不是表)中显示列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3716476/

相关文章:

java - Java中hashCode()和equals()方法有什么用?

java - Apache HttpClient 4.3 - 设置连接空闲超时

java - 将 FXML 中定义的 AnchorPane 动态添加到选项卡并稍后访问此 Pane 内容

java - 为每篇文章创建一个唯一的 html 文件是一个好习惯吗?

database - 有没有办法在 E-R 图中表示元组与表之间的关系?

postgresql - 如何在 Redshift 或 Postgres 的 View 中获取列依赖?

java - 为什么JavaFX中TextField继承自javafx.scene.Parent?

mysql - Bash:当服务器出现故障时关闭 MySQL 连接

php - 为什么数组会保留重复数据