Recherche…


Les bases

Tout d'abord, configurons le tableau d'exemple.

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

Rappelez-vous que lors de la récupération de données, si vous ne spécifiez pas de clause de classement des lignes (ORDER BY), le serveur SQL ne garantit pas le tri (ordre des colonnes) à tout moment . Vraiment, à tout moment. Et il est inutile de discuter de cela, il a été montré littéralement des milliers de fois et sur Internet.

No ORDER BY == pas de tri. Fin de l'histoire.

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

Il y a deux directions les données peuvent être commandées par:

  • ascendant (en remontant), en utilisant ASC
  • en descendant (en descendant), en utilisant 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

Lors de la commande par la colonne textuelle ((n) char ou (n) varchar), faites attention à ce que l'ordre respecte le classement. Pour plus d'informations sur le classement, recherchez le sujet.

La commande et le tri des données peuvent consommer des ressources. C'est là que les index correctement créés sont utiles. Pour plus d'informations sur les index, recherchez le sujet.

Il est possible de pseudo-randomiser l'ordre des lignes dans votre jeu de résultats. Il suffit de forcer la commande à paraître non déterministe.

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

La commande peut être mémorisée dans une procédure stockée, et c'est ainsi que vous devez le faire s'il s'agit de la dernière étape de manipulation de l'ensemble de lignes avant de le montrer à l'utilisateur final.

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

EXEC GetSortOrder
GO

Il existe également un support limité (et novateur) pour la commande dans les vues SQL Server, mais soyez encouragé à ne PAS l'utiliser.

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

Pour commander, vous pouvez utiliser des noms de colonne, des alias ou des numéros de colonne dans votre BY BY ORDER.

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

Je déconseille d'utiliser les numéros dans votre code, sauf si vous souhaitez l'oublier au moment où vous l'exécutez.

Commande par cas

Si vous souhaitez trier vos données numériquement ou alphabétiquement, vous pouvez simplement utiliser l' order by [column] . Si vous souhaitez trier à l'aide d'une hiérarchie personnalisée, utilisez une instruction de casse.

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

Utiliser un order by base order by :

Select * from MyTable
Order by Group

renvoie un tri alphabétique, ce qui n'est pas toujours souhaitable:

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

L'ajout d'une instruction 'case', en attribuant des valeurs numériques ascendantes dans l'ordre dans lequel vous voulez classer vos données:

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

renvoie les données dans l'ordre spécifié:

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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow