0

所以我正在尝试编写一个查询,从查询中获取列信息,这就是我尝试过的:

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;

...这不起作用,因为查询未保存为临时表或其他...

所以我需要将上述两个查询的功能合并为一个查询谢谢

4

2 回答 2

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;

那是你想要做的吗?

于 2012-09-10T20:13:09.340 回答
-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 ()

于 2012-09-10T20:15:31.293 回答