Szukaj…


Podstawy

Najpierw skonfigurujmy przykładową tabelę.

-- 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

Pamiętaj, że podczas pobierania danych, jeśli nie określisz klauzuli porządkowania wierszy (ORDER BY), serwer SQL nie gwarantuje sortowania (kolejności kolumn) w dowolnym momencie . Naprawdę w dowolnym momencie. I nie ma sensu się o to kłócić, zostało to pokazane dosłownie tysiące razy w całym Internecie.

Brak ORDER BY == brak sortowania. Koniec opowieści.

-- 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

Dane można uporządkować w dwóch kierunkach:

  • rosnąco (przejście w górę), za pomocą ASC
  • zejście (przejście w dół), używając 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

Przy zamawianiu według kolumny tekstowej ((n) char lub (n) varchar), zwróć uwagę, że kolejność jest zgodna z sortowaniem. Aby uzyskać więcej informacji na temat sortowania, wyszukaj temat.

Porządkowanie i sortowanie danych może powodować zużycie zasobów. Tutaj przydają się odpowiednio utworzone indeksy. Aby uzyskać więcej informacji na temat indeksów, wyszukaj temat.

Istnieje możliwość pseudolosowego losowania kolejności wierszy w zestawie wyników. Wystarczy zmusić uporządkowanie, by wydawało się niedeterministyczne.

SELECT * FROM SortOrder ORDER BY CHECKSUM(NEWID())
GO

Kolejność można zapamiętać w procedurze przechowywanej i tak należy to zrobić, jeśli jest to ostatni etap manipulowania zestawem wierszy przed pokazaniem go użytkownikowi końcowemu.

CREATE PROCEDURE GetSortOrder
AS
    SELECT * 
    FROM SortOrder 
    ORDER BY ID DESC
GO

EXEC GetSortOrder
GO

Obsługa zamówień w widokach programu SQL Server jest również ograniczona (i nieuczciwa), ale należy ich zachęcać, aby NIE korzystały z nich.

/* 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

Do zamawiania możesz użyć nazw kolumn, aliasów lub numerów kolumn w ORDER BY.

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

Odradzam używanie cyfr w kodzie, chyba że chcesz o nim zapomnieć chwilę po jego wykonaniu.

Sortuj według przypadku

Jeśli chcesz posortować dane numerycznie lub alfabetycznie, możesz po prostu użyć order by [column] . Jeśli chcesz sortować przy użyciu niestandardowej hierarchii, użyj instrukcji case.

Group
-----
Total
Young
MiddleAge
Old
Male
Female

Korzystanie z podstawowego order by :

Select * from MyTable
Order by Group

zwraca sortowanie alfabetyczne, co nie zawsze jest pożądane:

Group
-----
Female
Male
MiddleAge
Old    
Total
Young

Dodanie instrukcji „case”, przypisanie rosnących wartości liczbowych w kolejności, w jakiej chcesz posortować dane:

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

zwraca dane w podanej kolejności:

Group
-----
Total
Male
Female
Young
MiddleAge
Old


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow