【问题标题】:sql, database querysql,数据库查询
【发布时间】:2011-06-30 00:12:40
【问题描述】:

如果我不知道表的架构,谁能告诉我如何选择特定的列。就像我只想要数据库表第二列中的值而不知道列名一样。有没有办法做到这一点?

【问题讨论】:

标签: sql database ordinals


【解决方案1】:

您能否通过select * from mytable 找出列名是什么?

如果您的数据库支持 information_schema 视图,您也可以尝试select * from information_schema.columns where table_name = 'mytable'。还有其他方法可以找出列的名称。我建议只是尝试找出名称而不是任何其他可能的解决方法。

【讨论】:

    【解决方案2】:

    这可以通过 SQL Server/.NET 来完成,如下所示:

        SqlCommand command =
            new SqlCommand("SELECT * FROM TABLE", connection);
        connection.Open();
    
        SqlDataReader reader = command.ExecuteReader();
    
        // Call Read before accessing data.
        while (reader.Read())
        {
            string secondVal = reader[1].ToString();
        }
    

    不过,我会认真研究为什么您首先需要这样做。对我来说似乎很可疑......

    【讨论】:

    • 您知道,SqlDataReader 上的索引属性返回一个对象,而不是字符串
    【解决方案3】:

    您几乎不应该在任何代码中依赖表中的列号(即使理论上您可以在技术上对某些语言的某些数据库这样做)。

    有很多原因,其中一个最重要的原因是有人总是可以 ALTER 表并在开头/中间插入一列,从而完全破坏您的代码。

    第二个原因是列位置——即使你假设表永远不会改变——导致绝对不可读取,因此无法维护代码。您还记得 2 年后第 13 列是“last_name_3”吗?

    【讨论】:

      【解决方案4】:

      虽然我从不建议按照您的建议进行操作,但假设您的 RDBMS 已实现 SQL-92 INFORMATION_SCHEMA 标准,您可以获取列名并使用它来构建动态 SQL。

      SELECT c.COLUMN_NAME 
          FROM INFORMATION_SCHEMA.COLUMNS c 
          WHERE c.TABLE_NAME = 'YourTable' 
              AND c.ORDINAL_POSITION = 2
      

      【讨论】:

        【解决方案5】:

        不确定你想做什么。我真诚地希望你不要做你正在做的事情。但是,如果您只是想知道如何玩技术。这是一个例子。可能有更好的方法。

        mysql> desc test;
        +-------+--------------+------+-----+---------+-------+
        | Field | Type         | Null | Key | Default | Extra |
        +-------+--------------+------+-----+---------+-------+
        | id    | int(11)      | YES  |     | NULL    |       |
        | name  | varchar(100) | YES  |     | NULL    |       |
        +-------+--------------+------+-----+---------+-------+
        2 rows in set (0.00 sec)
        
        mysql> select * from test;
        +------+-------+
        | id   | name  |
        +------+-------+
        |    1 | name1 |
        |    2 | name2 |
        |    3 | name3 |
        |    4 | name4 |
        +------+-------+
        4 rows in set (0.00 sec)
        
        mysql> select @colid:=column_name from information_schema.columns where table_schema='test' and table_name='test' and ordinal_position=2;
        +---------------------+
        | @colid:=column_name |
        +---------------------+
        | name                |
        +---------------------+
        1 row in set (0.01 sec)
        
        mysql> set @sqlstr:=concat('select ', @colid, ' from test');
        Query OK, 0 rows affected (0.00 sec)
        
        mysql> prepare sttmt from @sqlstr;
        Query OK, 0 rows affected (0.00 sec)
        Statement prepared
        
        mysql> execute sttmt;
        +-------+
        | name  |
        +-------+
        | name1 |
        | name2 |
        | name3 |
        | name4 |
        +-------+
        4 rows in set (0.00 sec)
        

        参考最后一个例子http://dev.mysql.com/doc/refman/5.0/en/user-variables.html


        顺便说一句,谷歌将第一个链接作为完美的解决方案。 Select statement with column number instead of column names

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-22
          • 2021-12-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多