所以我正在尝试编写一个查询,从查询中获取列信息 这就是我的尝试:
Select login from TableName AS alias_name
SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE,COLUMN_DEFAULT,
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_Name = 'alias_name' ORDER BY ORDINAL_POSITION ASC;
... 这不起作用,因为查询不保存为临时表或不保存 ...
所以我需要将上面两个查询的功能组合成一个查询 感谢
答案 0 :(得分:1)
试试这个:
SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE,COLUMN_DEFAULT,
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_Name IN (SELECT login from TableName)
ORDER BY ORDINAL_POSITION ASC;
这是你想要做的吗?
答案 1 :(得分:-1)
这是不可能的;不是纯SQL。这不是MySQL的属性 - 其他RDBMS-es也不以这种方式提供查询元数据。
在纯SQL中最接近解决此问题的方法是将查询转换为视图,然后获取该视图的信息:
CREATE OR REPLACE VIEW _query
AS
SELECT login
FROM TableName
;
SELECT *
FROM information_schema.COLUMNS
WHERE table_schema = SCHEMA()
AND table_name = '_query'
;
这种方法的问题在于视图名称必须是唯一的,因此具有多个并发用户的应用程序面临着为视图提供唯一名称的挑战。这可以使用动态sql:
SET @name = CONCAT(_query, connection_id())
, @stmt = CONCAT(
' CREATE VIEW '
, @name
, ' AS SELECT login FROM Tablename'
)
;
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT *
FROM information_schema.columns
WHERE table_schema = schema()
AND table_name = @name
;
最后,你应该在事后清理你的观点:
SET @stmt = CONCAT('DROP VIEW ', @name);
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
问题是,为什么在SQL内部需要这个?通常,结果集元数据在SQL客户端中可用 - 通常,驱动程序或客户端库在您准备SQL语句时提供此功能。例如在JDBC http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#getMetaData()
中