我刚刚在某些代码中发现了一个错误。有一个类似于这样的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
但它也没有用。
谢谢,帕维尔
答案 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