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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow