Sök…


Grunderna

Låt oss först ställa in exempelbordet.

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

Kom ihåg att när du hämtar data, om du inte anger en radbeställningsklausul (ORDER BY) garanterar SQL-server inte sortering (kolumnordning) när som helst . Verkligen när som helst. Och det är ingen mening att argumentera om det, det har visats bokstavligen tusentals gånger och över hela internet.

Ingen ORDER BY == ingen sortering. Slutet av berättelsen.

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

Det finns två vägbeskrivningar som kan beställas av:

  • stigande (rör sig uppåt) med ASC
  • fallande (rör sig nedåt) med hjälp av 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är du beställer enligt textkolumnen ((n) char eller (n) varchar), var uppmärksam på att beställningen respekterar sorteringen. För mer information om sortering leta upp ämnet.

Beställning och sortering av data kan konsumera resurser. Det är här korrekt skapade index är praktiska. För mer information om index leta upp ämnet.

Det finns en möjlighet att pseudo-randomisera ordningen på raderna i din resultatsats. Tvinga bara beställningen för att verka obestämd.

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

Beställning kan komma ihåg i en lagrad procedur, och det är så du bör göra det om det är det sista steget att manipulera raderna innan du visar den till slutanvändaren.

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

EXEC GetSortOrder
GO

Det finns ett begränsat (och hackigt) stöd för beställning i SQL Server-vyerna, men uppmuntras INTE att använda den.

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

För beställning kan du antingen använda kolumnnamn, alias eller kolumnnummer i din 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

Jag rekommenderar att inte använda siffrorna i din kod, förutom om du vill glömma bort det ögonblicket efter att du kör det.

Beställ per fall

Om du vill sortera dina data numeriskt eller alfabetiskt kan du helt enkelt använda order by [column] . Om du vill sortera med en anpassad hierarki, använd ett ärende.

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

Använd en grundordning order by :

Select * from MyTable
Order by Group

returnerar en alfabetisk sortering, vilket inte alltid är önskvärt:

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

Lägga till ett "fall" -förklaring, tilldela stigande numeriska värden i den ordning du vill att dina data ska sorteras:

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

returnerar data i den angivna ordningen:

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow