【问题标题】:How can I get column names from a table in Oracle?如何从 Oracle 中的表中获取列名?
【发布时间】:2010-10-01 22:26:14
【问题描述】:

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

我发现了如何做到这一点:

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

【问题讨论】:

    标签: sql database oracle


    【解决方案1】:

    您可以查询 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/… 中的一些其他相关列数据
    • 确保表名是大写的。
    【解决方案2】:

    在 SQL Server 中...

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

    Type = 'V' 用于查看 表格的类型 = 'U'

    【讨论】:

      【解决方案3】:

      你可以这样做:

      describe EVENT_LOG
      

      desc EVENT_LOG
      

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 请注意,INFORMATION_SCHEMA 表是 ANSI 标准元数据表。任何优秀的现代 RDBMS 都会拥有它们。
        【解决方案5】:

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

        PRAGMA table_info(table-name);
        

        来自 sqlite.org 的解释:

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

        另请参阅:Sqlite.org Pragma Table Info

        【讨论】:

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

        该信息存储在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)
        

        【讨论】:

        • ALL_TAB_COLUMNS 上的官方文档,来自官方 Oracle 数据库参考。此视图描述了当前用户可访问的表、视图和集群的列。
        • 但是我们不能在表格前面给出模式名称,对吧?例如,如果我想要这样select column_name from all_tab_columns where table_name = 'dbo.usertbl';
        【解决方案7】:

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

        对于甲骨文

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

        【讨论】:

          【解决方案9】:
          describe YOUR_TABLE;
          

          在你的情况下:

          describe EVENT_LOG;
          

          【讨论】:

            【解决方案10】:

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

            select * from product where 1 != 1
            

            【讨论】:

              【解决方案11】:
              select column_name,* from information_schema.columns
               where table_name = 'YourTableName'
              order by ordinal_position
              

              【讨论】:

              • 这个查询是否有效,指定一个列名和星号-“选择列名,*”..它在 Oracle 中不起作用。
              【解决方案12】:

              对于 MySQL,使用

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

              【讨论】:

                【解决方案13】:

                对于 SQL Server:

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

                【讨论】:

                  【解决方案14】:
                  SELECT COLUMN_NAME 'all_columns' 
                  FROM INFORMATION_SCHEMA.COLUMNS 
                  WHERE TABLE_NAME='user';
                  

                  【讨论】:

                  • 欢迎来到 Stack Overflow @expert one。即使您的答案似乎是准确的,也请添加比“代码”更多的详细信息和解释。每个人都会更清楚。
                  【解决方案15】:

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

                  sp_columns TABLE_NAME
                  

                  【讨论】:

                    【解决方案16】:
                    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'
                    

                    【讨论】:

                      【解决方案17】:

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

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

                      【讨论】:

                        【解决方案18】:

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

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

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

                        【讨论】:

                          【解决方案19】:

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

                          【讨论】:

                            【解决方案20】:

                            您可以运行此查询

                            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;
                            

                            【讨论】:

                              【解决方案21】:

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

                              【讨论】:

                              • rownum 代表什么?我需要使用名为 rownum 的列吗?
                              【解决方案22】:

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

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

                              信息存储在 DBC 数据库中。

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

                              【讨论】:

                                【解决方案23】:

                                试试这个

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

                                【讨论】:

                                  【解决方案24】:

                                  我是这样做的

                                  SELECT 
                                      TOP 0
                                      *
                                  FROM
                                      Posts
                                  

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

                                  【讨论】:

                                    【解决方案25】:
                                    SELECT COLUMN_NAME 
                                    FROM YourDatabase.INFORMATION_SCHEMA.COLUMNS 
                                    WHERE TABLE_NAME = 'YourTableName'
                                    

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2017-12-23
                                      • 2016-04-03
                                      • 2011-11-08
                                      • 1970-01-01
                                      • 2018-02-25
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多