2011-02-18 118 views
1

任何人都可以告訴我如何選擇特定列,如果我不知道表。像的模式,如果我想只有在數據庫表中的第二列中的值不知道列名。有沒有辦法做到這一點?SQL數據庫查詢

+0

不行,你爲什麼不知道列名? – diagonalbatman 2011-02-18 17:54:53

+0

你爲什麼要這麼做? – 2011-02-18 17:55:05

回答

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


指最後一個例子順便說一句,谷歌給出了第一個鏈接是完美的解決方案。 Select statement with column number instead of column names

0

,你可以做一個select * from mytable找出列名是什麼?

您也可以嘗試select * from information_schema.columns where table_name = 'mytable'如果你的數據庫支持的INFORMATION_SCHEMA視圖。還有其他方法可以找出列的名稱。我會建議試圖找出任何其他可能的解決方法的名稱。

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(); 
    } 

我會採取在你爲什麼要做這個擺在首位,雖然很難看。似乎腥給我...

2

你應該幾乎從不依賴於列數的表中的任何代碼的(即使理論上可以在某些語言某些數據庫庫這樣做在技術上)。

原因有很多,其中最重要的一個是,有人可以隨時更改表,並在開始/中間插入一列,徹底打破你的代碼。

的第二個原因是,列位置 - 即使你認爲該表永遠不會改變 - 作出絕對無法讀取,因此無法維護的代碼。你會記得第2列從現在開始的2年是「last_name_3」嗎?

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