Поиск…


основы

Сначала давайте настроим таблицу примеров.

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

Помните, что при получении данных, если вы не укажете предложение упорядочения строки (ORDER BY), SQL-сервер не гарантирует сортировку (порядок столбцов) в любое время . Действительно, в любое время. И нет смысла спорить об этом, он был показан буквально тысячи раз и по всему Интернету.

Нет ORDER BY == no sorting. Конец истории.

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

Данные двух направлений можно упорядочить по:

  • восходящий (перемещение вверх), используя ASC
  • нисходящий (перемещение вниз), используя 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

При заказе текстовым столбцом ((n) char или (n) varchar) обратите внимание, что порядок соответствует сортировке. Для получения дополнительной информации о сортировке найдите тему.

Заказ и сортировка данных могут потреблять ресурсы. Именно здесь удобно создавать индексы. Для получения дополнительной информации об индексах найдите тему.

Существует возможность псевдо-рандомизации порядка строк в вашем наборе результатов. Просто заставьте порядок выглядеть недетерминированным.

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

Заказ можно запомнить в хранимой процедуре, и так вы должны это сделать, если это последний шаг манипулирования набором строк, прежде чем показывать его конечному пользователю.

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

EXEC GetSortOrder
GO

Существует ограниченная (и хакерская) поддержка для упорядочения в представлениях SQL Server, но рекомендуется не использовать ее.

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

Для заказа вы можете использовать имена столбцов, псевдонимы или номера столбцов в 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

Я советую не использовать цифры в вашем коде, за исключением случаев, когда вы хотите забыть об этом сразу после его выполнения.

Порядок по делам

Если вы хотите сортировать свои данные численно или в алфавитном порядке, вы можете просто использовать order by [column] . Если вы хотите сортировать, используя пользовательскую иерархию, используйте оператор case.

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

Используя базовый order by :

Select * from MyTable
Order by Group

возвращает алфавитный вид, что не всегда желательно:

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

Добавление оператора case, присваивающего возрастающие числовые значения в порядке сортировки ваших данных:

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

возвращает данные в указанном порядке:

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow