2010-11-02 54 views
14

我知道SQL列出所有列名的字母順序

SELECT * FROM Table 

將列出表中的所有列,但我感興趣的字母順序列出列。假設我有三列「姓名」,「年齡」和「性別」。

我想在格式

|age| |name| |sex| 

組織的列是否有可能與SQL做到這一點?

回答

12

是,並沒有:-)

SQL本身並不關心什麼順序列出來,但如果你使用:

select age, name, sex from ... 

你會發現,他們可能按照這個順序出來(儘管我不確定SQL標準要求這樣做)。

現在,你可能不希望做,但有時候生活是不公平:-)

您還可以使用DBMS數據定義表動態地構造一個查詢的另一種可能性。這是不可移植的,但大多數DBMS'提供這些表(例如DB/2的SYSIBM.SYSCOLUMNS),您可以按順序選擇列名。喜歡的東西:

select column_name from sysibm.syscolumns 
where owner = 'pax' and table_name = 'movies' 
order by column_name; 

然後你使用的的結果查詢構建真正的查詢:

query1 = "select column_name from sysibm.syscolumns" + 
     " where owner = 'pax' and table_name = 'movies'" + 
     " order by column_name" 
rs = exec(query1) 
query2 = "select" 
sep = " " 
foreach colm in rs: 
    query2 += sep + colm["column_name"] 
    sep = ", " 
query2 += " from movies order by rating" 
rs = exec(query2) 
// Now you have the rs recordset with sorted columns. 

但是,你真的應該嚴格審查該選擇*所有查詢 - 在絕大多數的情況下,這是沒有必要的和低效率的。數據的表示應該由表示層完成,而不是由DBMS自己完成 - DBMS應該儘可能以有效的方式返回數據。

+0

嗯,我想我不得不求助於做字符串排序的好老方法:) – 2010-11-02 08:05:05

+1

我同意這一點,切勿在生產代碼中使用*。例如,你永遠不知道什麼時候某人添加了一些不應列出的列。始終構建查詢以僅提取所需的列。如果你想動態地做到這一點,但一定要注意這一點非常明顯,供其他開發人員看到。 – 2010-11-02 08:20:24

+0

此外,如果使用SQL視圖*有更多的副作用,如果基礎表被更改(新的或刪除的列),視圖不會更新,因此它可能不會顯示新的列或者現有的列可能會被替換爲視圖選擇列的索引他們在視圖創建。 – 2010-11-02 08:21:50

0

你可能只是指定要選擇列:

SELECT age, name, sex FROM Table 

列將在相同的順序您在查詢中指定它們顯示。

+0

感謝您的回答。事實上情況是這樣的,編寫這麼多列是很繁瑣的。這就是爲什麼我想知道是否可以直接使用SQL查詢來做到這一點。也許另一種辦法是列出列名並使用外部程序來對列名進行排序。 – 2010-11-02 08:01:07

4
  • 沒有動態SQL,沒有辦法自動做到這一點。
  • SELECT *不建議和列名
  • 你必須明確地做SELECT age, name, sex FROM

在SQL級別,不要緊不會排序。對於任何客戶端代碼對象都不重要 -

如果它很重要,則在將數據呈現給客戶端時進行排序。

對不起,它就是這樣...

3

SQL-92標準規定當使用SELECT *時,列在表內的順序位置的升序中被引用。相關部分是4.8(列)和7.9(查詢規範)。我不知道該標準的任何供應商擴展將允許列以任何其他順序返回,可能是因爲通常不鼓勵使用SELECT *

您可以使用SQL DDL來確保列的序號位置符合所需的字母順序。但是,這隻會在您引用FROM條款中的sinlge表時以您想要的方式工作。如果引用兩個表,則SELECT *將按順序位置順序返回第一個表中的列,然後按順序位置返回第二個表的列,因此完整結果集的列可能不按字母順序排列。

9

這會生成一個查詢,並在select語句中按字母順序排列所有列。

DECLARE @QUERY VARCHAR(2000) 
DECLARE @TABLENAME VARCHAR(50) = '<YOU_TABLE>' 

SET @QUERY = 'SELECT ' 
SELECT @QUERY = @QUERY + Column_name + ', 
' 
    FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @TABLENAME 
ORDER BY Column_name 

SET @QUERY = LEFT(@QUERY, LEN(@QUERY) - 4) + ' 
FROM '+ @TABLENAME 

PRINT @QUERY 
EXEC(@QUERY) 
+1

這假設查詢將總是臨時運行,但如果海報可以與動態SQL一起使用,也是一個很好的起點。 – RThomas 2012-05-08 23:07:41

+2

爲我工作,使用此版本將Left語句(len) - 4更改爲-1 – Brian 2015-07-24 07:20:10

相關問題