运行以下命令时出现语法错误:
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/