Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按ORDERBY子句访问直接列值_Sql_Sql Server_Tsql_Sql Server 2000 - Fatal编程技术网

Sql 按ORDERBY子句访问直接列值

Sql 按ORDERBY子句访问直接列值,sql,sql-server,tsql,sql-server-2000,Sql,Sql Server,Tsql,Sql Server 2000,我刚刚在一些代码中发现了一个bug。有一个类似于此的SQL: SELECT convert(varchar(11),COL1,106) as COL1 FROM TAB ORDER BY COL1 DESC 现在,返回的值格式如下所示: 17 Sep 2001 07 Mar 2011 2011-03-07 00:00:00 2001-09-17 00:00:00 SELECT convert(varchar(11),COL1,106) as COL1 FROM (SELECT

我刚刚在一些代码中发现了一个bug。有一个类似于此的SQL:

SELECT convert(varchar(11),COL1,106) as COL1
FROM TAB
ORDER BY COL1 DESC
现在,返回的值格式如下所示:

17 Sep 2001
07 Mar 2011
2011-03-07 00:00:00
2001-09-17 00:00:00
SELECT  convert(varchar(11),COL1,106) as COL1
FROM    (SELECT      COL1
         FROM        TAB
         ORDER BY    COL1 DESC)
存储在数据库中的值如下所示:

17 Sep 2001
07 Mar 2011
2011-03-07 00:00:00
2001-09-17 00:00:00
SELECT  convert(varchar(11),COL1,106) as COL1
FROM    (SELECT      COL1
         FROM        TAB
         ORDER BY    COL1 DESC)
但是因为ORDERBY子句使用

17 Sep 2001
07 Mar 2011
值,排序不正确。由于我无法更改列名(查询和使用它的应用程序之间存在很大的依赖关系),因此我必须修改并修复SQL语句,以返回具有正确顺序的行。有并没有办法修改它,使ORDERBY子句使用存储在行的列中的实际值,而不是转换后的值?我试过:

ORDER BY TAB.COL1 DESC
但它也不起作用


谢谢,Pawel

您可以将字段的别名更改为除
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

您可以将字段的别名更改为除
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

您可以尝试以下方法:

17 Sep 2001
07 Mar 2011
2011-03-07 00:00:00
2001-09-17 00:00:00
SELECT  convert(varchar(11),COL1,106) as COL1
FROM    (SELECT      COL1
         FROM        TAB
         ORDER BY    COL1 DESC)

这基本上会在将结果放入转换方法之前对其进行排序。

您可以尝试以下方法:

17 Sep 2001
07 Mar 2011
2011-03-07 00:00:00
2001-09-17 00:00:00
SELECT  convert(varchar(11),COL1,106) as COL1
FROM    (SELECT      COL1
         FROM        TAB
         ORDER BY    COL1 DESC)

这将基本上对结果进行排序,然后再将其放入转换方法。

如果要在转换值之前进行排序,请尝试以下操作:

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 
或者,如果要在转换值后进行排序,请尝试以下操作:

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 

如果要在转换值之前进行排序,请尝试以下操作:

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 
或者,如果要在转换值后进行排序,请尝试以下操作:

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 

您应该用表名限定列名

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
编辑
如果您具有兼容级别SQLServer2000(80),则它也不会在该SQLServer的更高版本中工作。在这种情况下,我建议您更改兼容性级别。

您应该用表名限定列名

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
编辑 如果您具有兼容级别SQLServer2000(80),则它也不会在该SQLServer的更高版本中工作。在这种情况下,我建议您更改兼容性级别。

双重重命名:

SELECT convert(varchar(11), COLX, 106) AS COL1
FROM  
     ( SELECT COL1 AS COLX
       FROM TAB
     ) tmp
ORDER BY COLX DESC
双重重命名:

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


我无法更改使用该查询的do-it cos应用程序对列名起作用,因此COL1必须保持+1。第二个查询看起来不错:向调用者公开排序顺序列是一个很好的做法。我无法更改使用该查询的do-it cos应用程序对列名起作用,所以COL1必须保持+1第二个查询看起来不错:向调用者公开sort order列是一种很好的做法。op希望按原始值排序,而不是按转换后的值排序。我认为您的想法不错,我已将格式代码更改为120(以可排序格式返回日期)。现在这个子句看起来像这样:orderbyconvert(nvarchar(11),COL,120)DESC,结果和我预期的一样。谢谢如果您的第一个查询在派生表没有名称的情况下工作,并且在子查询中使用了
ORDER BY
,那么在受支持的SQL Server版本中肯定不起作用,我很惊讶。@onedaywhen:现在检查我的答案。我认为不需要子查询按原始列排序OK,同时我在MSSQLS2000服务器上进行了测试,ORDER by确实导致了错误,因此将其编辑掉是正确的;)op希望按原始值排序,而不是按转换后的值排序。我认为您的想法很好,我已将格式代码更改为120(以可排序格式返回日期)。现在这个子句看起来像这样:orderbyconvert(nvarchar(11),COL,120)DESC,结果和我预期的一样。谢谢如果您的第一个查询在派生表没有名称的情况下工作,并且在子查询中使用了
ORDER BY
,那么在受支持的SQL Server版本中肯定不起作用,我很惊讶。@onedaywhen:现在检查我的答案。我认为不需要子查询按原始列排序OK,同时我在MSSQLS2000服务器上进行了测试,ORDER by确实导致了错误,因此将其编辑掉是正确的;)@蜻蜓-您使用SQL Server 2000吗?它在SQL Server 2000上不起作用。很遗憾,是的。不过,感谢您的努力:)不幸的是,SQL Server 2000中有一个关于订购方式的错误。请参阅此讨论线程中的最后一项:@dragonfly-您是否使用SQL Server 2000?它在SQL Server 2000上不起作用。很遗憾,是的。不过,感谢您的努力:)不幸的是,SQL Server 2000中有一个关于订购方式的错误。请参阅此讨论线程中的最后一项: