OrderBy Pisząc aplikację w .NET zwykle używamy LINQ do sortowania danych ,ale jeśli dane pochodzą od systemu bazo danowego to dlaczego nie posortować informacji już na tym poziomie.

SQL oferuje nam klauzurę ORDER BY dzięki niej możemy ustalić po jakiej kolumnie informację będą posortowane.

Jak jednak przekazać dynamicznie informacje, po której kolumnie chcemy sortować wykonując dane zapytanie. Tutaj pojawia się słowo kluczowe CASE.

W tym wpisie pokaże prostą procedurę, która zwraca posortowany wynik w zależności od przekazanych parametrów.

Na początek utwórzmy prostą tabelkę People i umieścimy w niej jakieś informację.

CREATE TABLE dbo.People
(
ID INT NOT NULL  primary key,
Name VARCHAR(2048) NOT NULL,
Age INT NOT NULL,
Number INT NOT NULL
) 

INSERT INTO dbo.People(ID,Name,Age,Number)
VALUES (4,'Cezary',22,26),(1,'Zdzisław',11,30),
(9,'Franko',21,5),(7,'Adam',12,40)

Składnia naszej procedury wygląda tak:

CREATE PROCEDURE dbo.uspReadPeopleOrderBy 
@OrderByOption INT
AS
BEGIN
	SELECT [ID]
		  ,[Name]
		  ,[Age]
		  ,[Number]
	 FROM [dbo].[People]
  ORDER BY
	CASE WHEN @OrderByOption = 1 THEN [ID]  END,
	CASE WHEN @OrderByOption = 2 THEN [Name]   END,
	CASE WHEN @OrderByOption = 3 THEN [Age]   END,
	CASE WHEN @OrderByOption = 4 THEN [Number]   END
END
GO

W zależności od wartości parametru @OrderByOption wykona się dany ORDER BY. Przykład można jeszcze bardziej rozbudować w końcu w sortowaniu też liczby się kierunek. Oto polecenie zmieniające istniejącą już procedurę.

ALTER PROCEDURE dbo.uspReadPeopleOrderBy 
@OrderByOption INT,
@Direction BIT
AS
BEGIN
	SELECT [ID]
		  ,[Name]
		  ,[Age]
		  ,[Number]
	 FROM [dbo].[People]
  ORDER BY
	CASE WHEN @OrderByOption = 1 AND @Direction=0 THEN [ID]  END,
	CASE WHEN @OrderByOption = 1 AND @Direction=1 THEN [ID]  END DESC ,
	CASE WHEN @OrderByOption = 2 AND @Direction=0 THEN [Name]   END,
	CASE WHEN @OrderByOption = 2 AND @Direction=1 THEN [Name]   END DESC,
	CASE WHEN @OrderByOption = 3 AND @Direction=0 THEN [Age]   END,
	CASE WHEN @OrderByOption = 3 AND @Direction=1 THEN [Age]   END DESC,
	CASE WHEN @OrderByOption = 4 AND @Direction=0 THEN [Number]   END,
	CASE WHEN @OrderByOption = 4 AND @Direction=1 THEN [Number]   END DESC
END
GO

Przetestujmy procedurę wywołując ją.

EXEC	[dbo].[uspReadPeopleOrderBy]
		@OrderByOption = 2,
		@Direction = 1

Jak widać otrzymaliśmy wyniki posortowane po imieniu w kolejności malejącej.

image