Datum und Nullen von SQL Server ORDER BY
Ich versuche, order by Datum. Ich will die letzten Termine kommen in Erster. Das ist einfach genug, aber es gibt viele Datensätze, die null sind und diejenigen, die kommen, bevor alle Datensätze, die ein Datum haben.
Ich habe versucht ein paar Dinge mit keinen Erfolg:
ORDER BY ISNULL(Next_Contact_Date, 0)
ORDER BY ISNULL(Next_Contact_Date, 999999999)
ORDER BY coalesce(Next_Contact_Date, 99/99/9999)
Wie kann ich order by Datum und die Nullen kommen in der letzten? Der Datentyp ist smalldatetime
.
InformationsquelleAutor der Frage UpHelix | 2011-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
smalldatetime
hat Reichweite bis 6. Juni 2079, so dass Sie verwenden können,Wenn keine seriösen Aufzeichnungen müssen das Datum.
Ist dies nicht eine Annahme, die Sie Lust, sich auf eine robustere option ist die Sortierung nach zwei Spalten.
Beide der oben genannten Vorschläge sind nicht in der Lage, einen index verwenden, um zu vermeiden, eine Art jedoch und geben ähnliche suchen Pläne.
Eine andere Möglichkeit, wenn ein solcher index existiert, ist
InformationsquelleAutor der Antwort Martin Smith
Laut Itzik Ben-Gan, Autor von T-SQL Fundamentals for MS SQL Server 2012"By default, SQL-Server sortiert NULL Marken vor nicht-NULL Werte. Um NULL Marken zu Sortieren Letzte, die Sie verwenden können, eine FALL Ausdruck, gibt 1 zurück, wenn die" Next_Contact_Date Spalte ist NULL", und 0, wenn es nicht NULL. Nicht-NULL Marken bekommen 0 zurück, der durch den Ausdruck; daher, Sie zu Sortieren, bevor NULL markiert (die 1). Diese FALL Ausdruck verwendet, als die erste Spalte Sortieren klicken." Die Next_Contact_Date Spalte "sollte angegeben werden, wie die zweite Spalte Sortieren klicken. Auf diese Weise, nichtNULL Marken richtig sortiert unter sich." Hier ist die Lösung-Abfrage für dein Beispiel für MS SQL Server 2012 (und SQL Server 2014):
Entsprechende code mit IIF syntax:
InformationsquelleAutor der Antwort Andy
Ein bisschen spät, aber vielleicht jemand findet es nützlich.
Für mich, ISNULL wurde der Frage durch das Scannen der Tabelle. UNION ALL würde, mich zu wiederholen, eine komplexe Abfrage, und wegen mir die Auswahl nur die TOP-X hätte es wohl nicht sehr effizient.
Wenn Sie sind in der Lage, ändern Sie die Tabelle design, können Sie:
Fügen Sie ein anderes Feld, nur für die Sortierung, wie Next_Contact_Date_Sort.
Einen trigger erstellen, füllt das Feld mit einem großen (oder kleinen) Wert, je nachdem, was Sie brauchen:
InformationsquelleAutor der Antwort Aaa
InformationsquelleAutor der Antwort paparazzo
Wenn Ihr SQL nicht unterstützt
NULLS FIRST
oderNULLS LAST
ist der einfachste Weg, dies zu tun, ist die Verwendung dervalue IS NULL
Ausdruck:setzen, die null-Werte am Ende (
NULLS LAST
) odersetzen, die null-Werte an der front. Dies erfordert nicht die Kenntnis der Art der Spalte und ist leichter zu Lesen als die
CASE
Ausdruck.EDIT: Ach, das funktioniert zwar in anderen SQL-Implementierungen wie PostgreSQL und MySQL, es funktioniert nicht im MS SQL Server. Ich hatte nicht einen SQL-Server zu testen, vor und stützte sich auf Microsoft ' s Dokumentation und Tests mit anderen SQL-Implementierungen. Laut Microsoft
value IS NULL
ist ein Ausdruck , sollte natürlich genau wie jeden anderen Ausdruck. UndORDER BY
angeblich Ausdrücken wie jede andere Anweisung, die einen Ausdruck. Aber es hat nicht wirklich funktioniert.Die beste Lösung für SQL Server-daher scheint die
CASE
Ausdruck.InformationsquelleAutor der Antwort Vroo
Verwenden, desc und multiplizieren mit -1, wenn nötig. Beispiel für eine aufsteigende int Bestellung mit null-zuletzt:
InformationsquelleAutor der Antwort Ulf Herrmann