2010-11-02 48 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

相关问题