Microsoft SQL Server
Tri / classement des lignes
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