sql, запрос к базе данных - PullRequest
       23

sql, запрос к базе данных

1 голос
/ 18 февраля 2011

Может кто-нибудь сказать мне, как выбрать конкретный столбец, если я не знаю схему таблицы. Как, если я хочу только значения во втором столбце таблицы базы данных, не зная имя столбца.Есть ли способ сделать это?

Ответы [ 5 ]

2 голосов
/ 18 февраля 2011

Вы почти НИКОГДА не должны полагаться на номер столбца в таблице в любом своем коде (даже если теоретически вы МОЖЕТЕ делать это технически для определенных библиотек баз данных на определенных языках).

Есть много причин, одна изнаиболее важным является то, что кто-то всегда может изменить таблицу и вставить столбец в начале / середине, полностью нарушая ваш код.

Вторая причина заключается в том, что позиции столбцов - даже если вы предполагаете, что таблица никогда не изменяется -сделать для абсолютно НЕЧИТАЕМЫМ и поэтому невозможно поддерживать код.Помните ли вы, что столбец 13 был "last_name_3" через 2 года?

1 голос
/ 18 февраля 2011

Хотя я бы никогда не рекомендовал делать то, что вы предлагаете, предполагая, что в вашей РСУБД реализован стандарт SQL-92 INFORMATION_SCHEMA, вы можете получить имя столбца и использовать его для построения динамического SQL.

SELECT c.COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS c 
    WHERE c.TABLE_NAME = 'YourTable' 
        AND c.ORDINAL_POSITION = 2
0 голосов
/ 18 февраля 2011

Не уверен, что ты хотел сделать. И я искренне ожидаю, что вы не делаете то, что делаете . Но если вы хотите знать, как играть с техническими требованиями. Вот пример, чтобы сделать это. Там могут быть лучшие способы.

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 дает первую ссылку как идеальное решение. Выбрать оператор с номером столбца вместо имен столбцов

0 голосов
/ 18 февраля 2011

Это можно сделать с 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();
    }

Я бы внимательно посмотрел на то, зачем вам это нужно делать в первую очередь. Мне кажется подозрительным ...

0 голосов
/ 18 февраля 2011

Можете ли вы сделать select * from mytable, чтобы выяснить, как называются имена столбцов?

Вы также можете попробовать select * from information_schema.columns where table_name = 'mytable', если ваша база данных поддерживает представление information_schema.Есть и другие способы выяснить имена столбцов.Я бы посоветовал просто попытаться выяснить имя поверх любого другого возможного обходного пути.

...