在ORDER BY子句中访问直接列值

时间:2011-09-16 10:48:29

标签: sql sql-server tsql sql-server-2000

我刚刚在某些代码中发现了一个错误。有一个类似于这样的SQL:

SELECT convert(varchar(11),COL1,106) as COL1
FROM TAB
ORDER BY COL1 DESC

现在,返回的 COL1 值格式如下所示:

17 Sep 2001
07 Mar 2011

和存储在数据库中的值如下所示:

2011-03-07 00:00:00
2001-09-17 00:00:00

但是因为ORDER BY子句使用

17 Sep 2001
07 Mar 2011

值,排序不正确。由于我无法更改列名(查询和使用它的应用程序之间有很大的依赖关系),我必须修改&修复SQL语句以返回正确排序的行。有没有办法以ORDER BY子句使用存储在行列中的实际值而不是转换为一个的方式来修改它?我试过了:

ORDER BY TAB.COL1 DESC

但它也没有用。

谢谢,帕维尔

5 个答案:

答案 0 :(得分:2)

您可以将字段的别名更改为COL1以外的其他名称,这会导致ORDER BY继续执行字段本身而不是计算的别名:

SELECT convert(varchar(11),COL1,106) as COL1_ALIAS
FROM TAB
ORDER BY COL1 DESC

<强>更新

如果列名需要保持不变,请尝试以下方法:

SELECT convert(varchar(11),COL1,106) as COL1, COL1 AS COL1_ORIGINAL
FROM TAB
ORDER BY COL1_ORIGINAL DESC

答案 1 :(得分:2)

您应该使用表名

限定列名
ORDER BY TAB.COL1 DESC

试试这个

create table TAB(Col1 datetime)

insert into TAB values (getdate())
insert into TAB values (getdate()+323)

SELECT convert(varchar(11),COL1,106) as COL1
FROM TAB
ORDER BY TAB.COL1 DESC

SELECT convert(varchar(11),COL1,106) as COL1
FROM TAB
ORDER BY COL1 DESC

SQL Server 2008和SQL Server 2005的结果:

COL1
-----------
04 Aug 2012
16 Sep 2011

(2 row(s) affected)

COL1
-----------
16 Sep 2011
04 Aug 2012

(2 row(s) affected)

这对SQL Server 2000不起作用,所以如果你真的需要列名与别名相同,这里有一个解决方法。

SELECT convert(varchar(11),COL1,106) as COL1
FROM TAB
ORDER BY convert(datetime, COL1) DESC

修改 如果您具有兼容级别SQL Server 2000(80),它在以后的SQL Server版本中也不起作用。在这种情况下,我建议您更改兼容级别。

答案 2 :(得分:1)

您可以尝试这样的事情:

SELECT  convert(varchar(11),COL1,106) as COL1
FROM    (SELECT      COL1
         FROM        TAB
         ORDER BY    COL1 DESC)

这基本上会在将结果投入convert方法之前对结果进行排序。

答案 3 :(得分:1)

如果你想在转换价值之前进行排序,那么试试这个:

SELECT  CONVERT(VARCHAR(11),COL1,106) as COL1 
FROM        TAB 
ORDER BY    COL1 DESC

或者如果您想在转换值后进行排序,请尝试以下方法:

SELECT convert(varchar(11),COL1,106) as COL1 
FROM TAB 
ORDER BY convert(varchar(11),COL1,106) DESC 

答案 4 :(得分:0)

双重重命名:

SELECT convert(varchar(11), COLX, 106) AS COL1
FROM  
     ( SELECT COL1 AS COLX
       FROM TAB
     ) tmp
ORDER BY COLX DESC