ChatGPT解决这个技术问题 Extra ChatGPT

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

我需要查询数据库以获取列名,不要与表中的数据混淆。例如,如果我有一个名为 EVENT_LOG 的表,其中包含 eventIDeventTypeeventDesceventTime,那么我想从查询中检索这些字段名称,而不是别的。

我发现如何做到这一点:

微软 SQL 服务器

MySQL

PostgreSQL

但我需要知道:如何在 Oracle 中做到这一点?


b
baretta

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

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

请注意,这是特定于 Oracle 的。
有什么理由可以返回“未选择行”吗? (在甲骨文中。)
如果您“未选择任何行”,则可以尝试将 USER_TAB_COLUMNS 更改为 all_tab_columns。要 100% 确定结果,您可以指定所有者。
您可以添加“ORDER by column_id”,以防您希望按照它们在表中创建的顺序来检索它们。以下是表 docs.oracle.com/cd/B19306_01/server.102/b14237/… 中的一些其他相关列数据
确保表名是大写的。
E
Eppz

在 SQL 服务器中...

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

视图类型 = 'V' 表格类型 = 'U'


m
mathguy

你可以这样做:

describe EVENT_LOG

或者

desc EVENT_LOG

注意:仅当您知道表名并且专门针对 Oracle 时才适用。


J
Jom

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

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

请注意,INFORMATION_SCHEMA 表是 ANSI 标准元数据表。任何优秀的现代 RDBMS 都会拥有它们。
T
ThE uSeFuL

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

PRAGMA table_info(table-name);

来自 sqlite.org 的解释:

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

另请参阅:Sqlite.org Pragma Table Info


我也不确定为什么我被否决了,但我很高兴它对你有所帮助。
它可能已被否决,因为该问题被标记为 Oracle。
我已经删除了 Oracle 标记并对此表示赞同——我认为由于答案太多,所以这个问题作为一般问题更有效。 (我来这里是为了寻找 mySQL 的。)
J
Jon Ericson

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

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

DUMMY

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

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

通过官方 Oracle Database Reference 获得有关 ALL_TAB_COLUMNS 的官方文档。此视图描述当前用户可访问的表、视图和集群的列。
但是我们不能在表前给出模式名称,对吧?例如,如果我想要这样 select column_name from all_tab_columns where table_name = 'dbo.usertbl';
S
Sasha

其他答案足以回答这个问题,但我想我会分享一些额外的信息。其他人则描述“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 '|' 错误
j
jampez77

对于甲骨文

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

R
Rohit
describe YOUR_TABLE;

在你的情况下:

describe EVENT_LOG;

R
Robert

即使这也是我们可以使用它的一种方式

select * from product where 1 != 1

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

这个查询是否有效,指定一个列名和星号-“选择列名,*”..它在 Oracle 中不起作用。
N
Nick Cox

对于 MySQL,使用

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

T
Tushar Gupta - curioustushar

对于 SQL Server:

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

L
Lucas Zamboulis
SELECT COLUMN_NAME 'all_columns' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='user';

欢迎来到 Stack Overflow @expert one。即使您的答案似乎是准确的,也请添加比“代码”更多的细节和解释。每个人都会更清楚。
W
WEFX

你也可以试试这个,但它可能比你需要的信息多:

sp_columns TABLE_NAME

d
dreamcrash
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'

D
Dbo

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 需要 '|'用于多个输入,但也是一种保持数据分离并易于存储/传递给类/函数的方法。

为了安全起见,尝试在发送时也加入虚拟数据,并比较接收到任何错误时返回的内容。


R
Renaud Kern

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

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

USER_TAB_COLUMNS 描述了当前用户拥有的表、视图和集群的列。此视图不显示 OWNER 列。


u
user2558588

答案就在这里: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'];
    }
}

E
Etibar - a tea bar

你可以运行这个查询

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;

b
blue-sky

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


rownum 代表什么?我需要使用名为 rownum 的列吗?
D
Dan Is Fiddling By Firelight

尝试这个

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%'

C
Community

遇到这个问题,寻找对 Teradata 上列名的访问权限,所以我将添加他们对 SQL 的“风味”的答案:

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

信息存储在 DBC 数据库中。

获取数据类型有点复杂:Get column type using teradata system tables


V
Val

我是这样做的

SELECT 
    TOP 0
    *
FROM
    Posts

它甚至在我不知道其服务表的 http://data.stackexchange.com 中也有效!


L
Luís Cruz
SELECT COLUMN_NAME 
FROM YourDatabase.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'YourTableName'