sql, запрос к базе данных
Может кто-нибудь сказать мне, как выбрать конкретный столбец, если я не знаю схему таблицы. Как, если я хочу только значения во втором столбце таблицы базы данных, не зная имя столбца. Есть способ сделать это?
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
Кстати, Google дает первую ссылку как идеальное решение. Выберите оператор с номером столбца вместо имен столбцов
Вы почти НИКОГДА не должны полагаться на номер столбца в таблице в любом своем коде (даже если теоретически вы МОЖЕТЕ делать это технически для определенных библиотек баз данных на определенных языках).
Есть много причин, одна из самых важных состоит в том, что кто-то всегда может ИЗМЕНИТЬ таблицу и вставить столбец в начале / середине, полностью нарушая ваш код.
Вторая причина заключается в том, что позиции столбцов - даже если вы предполагаете, что таблица никогда не изменяется - делают абсолютно НЕЗАКОННЫМ и, следовательно, невозможно поддерживать код. Помните ли вы, что столбец 13 был "last_name_3" через 2 года?
Хотя я бы никогда не рекомендовал делать то, что вы предлагаете, предполагая, что в вашей РСУБД реализован стандарт 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();
}
Я бы внимательно посмотрел на то, почему вы должны делать это в первую очередь. Мне кажется подозрительным...