2009-05-04 11 views
51

Mam procedurę składowaną, która wykonuje instrukcję select. Chciałbym, aby moje wyniki uporządkowano według pola daty i wyświetlić wszystkie rekordy z NULL datami, a następnie datami najświeższymi.ORDER BY DATE pokazuje najpierw NULLS, a następnie najnowsze daty.

Oświadczenie wygląda następująco:

SELECT a,b,c,[Submission Date] 
FROM someView 
ORDER BY [Submission Date] ASC 

Teraz wyświetli wszystkie zapisy z NULL Składanie Daty początku, ale kiedy się do wierszy, które mają wartości dat w nich, nie są najnowsze daty w widok.

Jeśli zastąpię ASC z DESC, otrzymam daty w żądanej kolejności, ale wartości NULL są na dole mojego zestawu wyników.

Czy istnieje sposób na uporządkowanie mojego zapytania, aby wyświetlić wartości puste u góry, a następnie, gdy są wartości daty, aby uporządkować je od najbardziej aktualnego do najstarszego?

Odpowiedz

85

@ Chris, prawie go masz.

ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, 
     [Submission Date] DESC 

[Edit: #Eppz poprosił mnie, aby dostosować powyższy kod jak obecnie przedstawiono]

ja osobiście wolę to dużo lepiej niż tworzenie „magicznych liczb”. Magiczne liczby są prawie zawsze problemem, który czeka, aby się wydarzyć.

+4

Po co zawracać sobie głowę DESC? Po prostu zmień 0 i 1. –

+0

Oczywiście, ale starałem się, aby moje zmiany były jak najbliżej sugestii Chrisa. –

+0

Właściwie nie patrzyłem na znaczniki, aby zobaczyć, że było to dla sql2000. Mój powinien działać w MySQL. :) –

3

spróbować

SELECT a,b,c,[Submission Date] 
FROM someView 
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC 
+0

9999/99/99 z wygeneruje błąd, ponieważ nie może być analizowany na bieżąco. – Eppz

+0

Używałbym tego rozwiązania zamiast sprawy. – Ionic

+0

Może łatwo używać w LINQ – yoohoo

21

można zrobić coś takiego umieścić NULL u dołu:

ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC 
+0

+1 to była jedyna odpowiedź, która działała dla mnie w SQL Access. –

+1

To działało również w SQLite. – IAmKale

+0

Czy istnieje powód, dla którego masz kwadratowe nawiasy? – AndrewBramwell

0

spróbować

SELECT a, b, c, [Data wysłania ] OD someView ZAMÓW PRZEZ isnull ([Submissi w dniu], obsada ("1770/01/01" jako datetime)) ASC

+1

dziękuję za obsadę ("2079/01/01" jako datetime) część ! – Sadegh

14

standard SQL (ISO/IEC 9075-2: 2003 lub później - 2008) przewiduje:

ORDER BY SomeColumn NULLS FIRST 

Większość DBMS rzeczywistości nie obsługują tego jeszcze AFAIK.

+1

Dzięki za tą wskazówkę, współpracujesz z Oracle 11g. –

+2

Działa również z PostgreSQL 9.2.1. –

1
OrderBy="ColumnName = NULL desc, ColumnName desc" 
0

wiem, że to jest stary, ale kiedy okazało się, że zauważyłem przyjętego rozwiązania, https://stackoverflow.com/a/821856/7177892 może zostać uproszczone poprzez wynik instrukcji CASE być dzisiaj (GETDATE()) lub faktycznej daty.

oryginalny:

ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, 
     [Submission Date] DESC 

uproszczony:

ORDER BY (CASE WHEN [Submission Date] IS NULL 
       THEN GETDATE() 
       ELSE [Submission Date] 
      END) DESC 
+1

To uproszczenie nie zadziała tak jak jest, jeśli posiadasz zapisy z dzisiejszą datą lub przyszłymi datami. W takim przypadku możesz zmienić metodę z GETDATE() na DATEADD() i dodać nieprzyzwoicie dużą liczbę dni lub lat do bieżącej daty. – nconantj

Powiązane problemy