Microsoft SQL Server
Reihen sortieren / sortieren
Suche…
Grundlagen
Lassen Sie uns zunächst die Beispieltabelle einrichten.
-- Create a table as an example
CREATE TABLE SortOrder
(
ID INT IDENTITY PRIMARY KEY,
[Text] VARCHAR(256)
)
GO
-- Insert rows into the table
INSERT INTO SortOrder ([Text])
SELECT ('Lorem ipsum dolor sit amet, consectetur adipiscing elit')
UNION ALL SELECT ('Pellentesque eu dapibus libero')
UNION ALL SELECT ('Vestibulum et consequat est, ut hendrerit ligula')
UNION ALL SELECT ('Suspendisse sodales est congue lorem euismod, vel facilisis libero pulvinar')
UNION ALL SELECT ('Suspendisse lacus est, aliquam at varius a, fermentum nec mi')
UNION ALL SELECT ('Praesent tincidunt tortor est, nec consequat dolor malesuada quis')
UNION ALL SELECT ('Quisque at tempus arcu')
GO
Beachten Sie, dass der SQL-Server beim Abrufen von Daten, wenn Sie keine Zeilenreihenfolgeklausel (ORDER BY) angeben, die Sortierung (Reihenfolge der Spalten) zu keinem Zeitpunkt gewährleistet. Wirklich zu jeder Zeit. Es gibt keinen Grund, darüber zu streiten, es wurde buchstäblich Tausende Male und im ganzen Internet gezeigt.
Keine ORDER BY == keine Sortierung. Ende der Geschichte.
-- It may seem the rows are sorted by identifiers,
-- but there is really no way of knowing if it will always work.
-- And if you leave it like this in production, Murphy gives you a 100% that it wont.
SELECT * FROM SortOrder
GO
Es gibt zwei Richtungen, die nach Daten geordnet werden können:
- aufsteigend (aufwärts) mit ASC
- absteigend (abwärts) mit DESC
-- Ascending - upwards
SELECT * FROM SortOrder ORDER BY ID ASC
GO
-- Ascending is default
SELECT * FROM SortOrder ORDER BY ID
GO
-- Descending - downwards
SELECT * FROM SortOrder ORDER BY ID DESC
GO
Achten Sie bei der Bestellung in der Textspalte ((n) char oder (n) varchar) darauf, dass die Reihenfolge die Sortierung berücksichtigt. Weitere Informationen zur Kollatierung finden Sie unter dem Thema.
Das Sortieren und Sortieren von Daten kann Ressourcen beanspruchen. Hier sind richtig erstellte Indizes hilfreich. Weitere Informationen zu Indizes finden Sie unter dem Thema.
Es besteht die Möglichkeit, die Reihenfolge der Zeilen in Ihrem Resultset pseudozufällig zu sortieren. Erzwingen Sie einfach die Reihenfolge, um nicht deterministisch zu erscheinen.
SELECT * FROM SortOrder ORDER BY CHECKSUM(NEWID())
GO
Die Reihenfolge kann in einer gespeicherten Prozedur gespeichert werden. Dies ist die Art und Weise, in der Sie das tun sollten, wenn Sie das Rowset als letzten Schritt bearbeiten, bevor Sie es dem Endbenutzer zeigen.
CREATE PROCEDURE GetSortOrder
AS
SELECT *
FROM SortOrder
ORDER BY ID DESC
GO
EXEC GetSortOrder
GO
Es gibt auch eine begrenzte (und harte) Unterstützung für das Sortieren in den SQL Server-Ansichten. Es wird jedoch empfohlen, diese Option NICHT zu verwenden.
/* This may or may not work, and it depends on the way
your SQL Server and updates are installed */
CREATE VIEW VwSortOrder1
AS
SELECT TOP 100 PERCENT *
FROM SortOrder
ORDER BY ID DESC
GO
SELECT * FROM VwSortOrder1
GO
-- This will work, but hey... should you really use it?
CREATE VIEW VwSortOrder2
AS
SELECT TOP 99999999 *
FROM SortOrder
ORDER BY ID DESC
GO
SELECT * FROM VwSortOrder2
GO
Zur Bestellung können Sie in Ihrem ORDER BY entweder Spaltennamen, Aliasnamen oder Spaltennummern verwenden.
SELECT *
FROM SortOrder
ORDER BY [Text]
-- New resultset column aliased as 'Msg', feel free to use it for ordering
SELECT ID, [Text] + ' (' + CAST(ID AS nvarchar(10)) + ')' AS Msg
FROM SortOrder
ORDER BY Msg
-- Can be handy if you know your tables, but really NOT GOOD for production
SELECT *
FROM SortOrder
ORDER BY 2
Ich rate davon ab, die Zahlen in Ihrem Code zu verwenden, es sei denn, Sie möchten es gleich nach der Ausführung vergessen.
Bestellung nach Fall
Wenn Sie Ihre Daten numerisch oder alphabetisch sortieren möchten, können Sie einfach order by [column]
. Wenn Sie nach einer benutzerdefinierten Hierarchie sortieren möchten, verwenden Sie eine case-Anweisung.
Group
-----
Total
Young
MiddleAge
Old
Male
Female
Mit einer Grundbestellung order by
:
Select * from MyTable
Order by Group
gibt eine alphabetische Sortierung zurück, die nicht immer erwünscht ist:
Group
-----
Female
Male
MiddleAge
Old
Total
Young
Hinzufügen einer 'case'-Anweisung, wobei aufsteigende numerische Werte in der Reihenfolge zugewiesen werden, in der Ihre Daten sortiert werden sollen:
Select * from MyTable
Order by case Group
when 'Total' then 10
when 'Male' then 20
when 'Female' then 30
when 'Young' then 40
when 'MiddleAge' then 50
when 'Old' then 60
end
gibt Daten in der angegebenen Reihenfolge zurück:
Group
-----
Total
Male
Female
Young
MiddleAge
Old