如果我不知道表的架构,谁能告诉我如何选择特定的列。就像我只想要数据库表第二列中的值而不知道列名一样。有没有办法做到这一点?
5 回答
您几乎不应该在任何代码中依赖表中的列号(即使理论上您可以在技术上为某些语言的某些数据库库这样做)。
原因有很多,其中一个最重要的原因是有人总是可以 ALTER 表并在开头/中间插入一列,从而完全破坏您的代码。
第二个原因是列位置——即使你假设表永远不会改变——导致绝对不可读取,因此无法维护代码。您还记得 2 年后第 13 列是“last_name_3”吗?
尽管我从不建议按照您的建议进行操作,但假设您的 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
你能select * from mytable
弄清楚列名是什么吗?
select * from information_schema.columns where table_name = 'mytable'
如果您的数据库支持 information_schema 视图,您也可以尝试。还有其他方法可以找出列的名称。我建议只是尝试找出任何其他可能解决方法的名称。
这可以使用 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();
}
不过,我会认真研究为什么您首先需要这样做。对我来说似乎很鱼...
不确定你想做什么。我真诚地希望你不要做你正在做的事情。但是,如果您只是想知道如何玩技术。这是一个例子。可能有更好的方法。
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
顺便说一句,谷歌给出了第一个链接作为完美的解决方案。使用列号而不是列名选择语句