1

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

4

5 回答 5

2

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

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

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

于 2011-02-18T17:58:07.363 回答
1

尽管我从不建议按照您的建议进行操作,但假设您的 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
于 2011-02-18T18:03:04.110 回答
0

你能select * from mytable弄清楚列名是什么吗?

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

于 2011-02-18T17:57:46.687 回答
0

这可以使用 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();
    }

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

于 2011-02-18T17:57:55.687 回答
0

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

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


顺便说一句,谷歌给出了第一个链接作为完美的解决方案。使用列号而不是列名选择语句

于 2011-02-18T18:19:34.610 回答