如何从Oracle中的表中获取列名?


184

我需要查询数据库以获取列名,不要与表中的数据混淆。举例来说,如果我有一个名为表中EVENT_LOG包含eventIDeventTypeeventDesc,和eventTime,然后我会想检索查询,并没有其他的字段名。

我在以下位置找到了如何执行此操作:

但是我需要知道:如何在Oracle中完成此操作?

Answers:


191

您可以查询USER_TAB_COLUMNS表以获取表列元数据。

SELECT table_name, column_name, data_type, data_length
FROM USER_TAB_COLUMNS
WHERE table_name = 'MYTABLE'

21
请注意,这特定于Oracle。
ConcernedOfTunbridgeWells

8
有什么理由可以返回“未选择行”吗?(在Oracle中)
Ian R. O'Brien

9
如果您未选择任何行,则可以尝试更改USER_TAB_COLUMNSall_tab_columns。要对结果100%确定,您可以指定所有者。
德拉孔迪斯2015年

2
如果要以在表中创建它们的相同顺序检索它们,可以添加“ ORDER by column_id”。这是来自表docs.oracle.com/cd/B19306_01/server.102/b14237/…的
Bernauer

2
确保表名是大写的。
休·希格雷夫斯

67

在SQL Server中...

SELECT [name] AS [Column Name]
FROM syscolumns
WHERE id = (SELECT id FROM sysobjects WHERE type = 'V' AND [Name] = 'Your table name')

类型='V'用于视图类型='U'用于表



26

对于SQL Server 2008,我们可以使用information_schema.columns获取列信息

SELECT *
FROM   information_schema.columns
WHERE  table_name = 'Table_Name'
ORDER  BY ordinal_position  

1
请注意,这些INFORMATION_SCHEMA表是ANSI标准元数据表。任何好的现代RDBMS都会拥有它们。
培根片2014年

18

对于SQLite,我相信您可以使用如下所示的内容:

PRAGMA table_info(table-name);

来自sqlite.org的解释:

该编译指示为命名表中的每一列返回一行。结果集中的列包括列名称,数据类型,该列是否可以为NULL以及该列的默认值。对于不属于主键的列,结果集中的“ pk”列为零,对于属于主键的列,其为主键中列的索引。

另请参见:Sqlite.org语法表信息


1
我不确定为什么我也被否决了,但是我很高兴它对您有所帮助。
shieldstroy 2013年

2
它可能已被否决,因为该问题被标记为Oracle。
Burhan Ali

2
我删除了Oracle标记并对此进行了投票-我认为,既然有很多答案,那么这个问题作为一般问题就更好了。(我是来这里寻找mySQL的。)
icedwater

16

该信息存储在ALL_TAB_COLUMNS系统表中:

SQL> select column_name from all_tab_columns where table_name = 'DUAL';

DUMMY

或者DESCRIBE,如果您使用的是SQL * PLUS,则可以使用该表:

SQL> desc dual
Name                               Null?    Type
----------------------------------------------------- -------- ---------------------- -------------
DUMMY                               VARCHAR2(1)

可以ALL_TAB_COLUMNS通过官方的Oracle Database Reference获得官方文档。该视图描述了当前用户可访问的表,视图和集群的列。
Polywhirl先生15年

但是我们不能在表的前面给出模式名称,对吗?例如,如果我想要这样 select column_name from all_tab_columns where table_name = 'dbo.usertbl';
AhammadaliPK

9

其他答案足以回答问题,但我想我会分享一些其他信息。其他人描述“ DESCRIBE table”语法以获取表信息。如果要以相同的格式获取信息,但不使用DESCRIBE,则可以执行以下操作:

SELECT column_name as COLUMN_NAME, nullable || '       ' as BE_NULL,
  SUBSTR(data_type || '(' || data_length || ')', 0, 10) as TYPE
 FROM all_tab_columns WHERE table_name = 'TABLENAME';

可能没什么大不了的,但是我之前写了它,看起来很合适。


现在(几年后)在SQL Server 2008中尝试此操作,我收到一个Incorrect Syntax near '|'错误
Al Lelopath 2014年

4

对于Oracle

SELECT column_name FROM user_tab_cols WHERE table_name=UPPER('tableName');

3
select column_name,* from information_schema.columns
 where table_name = 'YourTableName'
order by ordinal_position

通过指定col名称和star-“ select column_name,*”。来完成此查询工作。它在Oracle中不起作用。
Teja 2015年

3
describe YOUR_TABLE;

在您的情况下:

describe EVENT_LOG;

3

对于MySQL,请使用

SELECT column_name 
FROM information_schema.columns 
WHERE 
table_schema = 'Schema' AND table_name = 'Table_Name'

3

即使这也是我们使用它的方式之一

select * from product where 1 != 1

2

对于SQL Server:

SELECT [name] AS [Column Name]
FROM syscolumns
WHERE id = object_id('TABLE_NAME')

2
SELECT COLUMN_NAME 'all_columns' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='user';

欢迎使用Stack Overflow @expert一。即使您的答案似乎是正确的,也请添加比“代码”更多的详细信息和解释。每个人都会更清楚。
让·雷米Revy

1

您也可以尝试这样做,但可能提供的信息超出了您的需要:

sp_columns TABLE_NAME

1

MySQL的

SHOW COLUMNS FROM a_table_named_users WHERE Field REGEXP 'user_id|user_name|user_pass'

这将返回如下结果:

Field     |  Type        |   Null   |   Key   |   Default   |   Extra  
user_id      int(8)          NO         PRI       NULL          auto_increment
user_name    varchar(64)     NO         MUL       NULL
user_pass    varchar(64)     NO                   NULL

然后取出值,您可以简单地

fetch row[0]

这对于动态传递输入也非常有用,因为REGEXP需要'|'。用于多个输入,但也是一种使数据分离并易于存储/传递给类/函数的方法。

为了安全起见,请尝试抛出伪数据,并比较收到任何错误后返回的内容。


1

在Oracle中,有两个描述列的视图:

  • DBA_TAB_COLUMNS描述数据库中所有表,视图和群集的列。

  • USER_TAB_COLUMNS描述
    了当前用户拥有的表,视图和群集的列。该视图不显示“
    所有者”列。


0

答案在这里:http : //php.net/manual/en/function.mysql-list-fields.php 在您的情况下,我将使用以下代码:

$result = mysql_query("SHOW COLUMNS FROM sometable");
if (!$result) {
    echo 'Could not run query: ' . mysql_error();
    exit;
}
$fields = array();
if (mysql_num_rows($result) > 0) {
    while ($row = mysql_fetch_assoc($result)) {
        $fields[] = $row['Field'];
    }
}

0
SELECT A.COLUMN_NAME, A.* FROM all_tab_columns a 
WHERE table_name = 'Your Table Name'
AND A.COLUMN_NAME = 'COLUMN NAME' AND a.owner = 'Schema'

0

您可以运行此查询

SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%%' --if you want to find specific column write here 
ORDER BY schema_name, table_name;

-1

只需从表中选择第一行,对于oracle: select * from <table name> where rownum = 1;


rownum代表什么?我是否需要使用名为rownum的列?
mervebıçakçı2015年

-1

遇到了这个问题,试图访问Teradata上的列名,因此我将为其SQL的“风味”添加答案:

SELECT ColumnName
FROM DBC.Columns
WHERE DatabaseName='DBASE_NAME'
AND TableName='TABLE_NAME';

该信息存储在DBC数据库中。

获取数据类型要花点时间使用Teradata系统表获取列类型


-1

试试这个

select * from sys.all_columns c join sys.objects o on c.object_id=o.object_id where o.name = 'TABLENAME' and c.name like '%COLUMN NAME%'


-3
SELECT COLUMN_NAME 
FROM YourDatabase.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'YourTableName'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.