Доступ к прямому значению столбца в предложении ORDER BY - PullRequest
0 голосов
/ 16 сентября 2011

Я только что заметил ошибку в каком-то фрагменте кода.Существует 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 ]

2 голосов
/ 16 сентября 2011

Вы должны указать название столбца с именем таблицы

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, если у вас есть уровень совместимости SQL Server 2000 (80). В этом случае я предлагаю вам изменить уровень совместимости.

2 голосов
/ 16 сентября 2011

Вы можете просто изменить псевдоним вашего поля на что-то отличное от 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 голос
/ 16 сентября 2011

если вы хотите отсортировать перед преобразованием значения, попробуйте это:

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 
1 голос
/ 16 сентября 2011

Вы можете попробовать что-то вроде этого:

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

Это в основном упорядочит результат перед тем, как выбросить его в метод convert.

0 голосов
/ 16 сентября 2011

Двойное переименование:

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