Ricerca…


Nozioni di base

Per prima cosa, impostiamo la tabella di esempio.

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

Ricordare che quando si recuperano i dati, se non si specifica una clausola di ordinamento delle righe (ORDER BY), il server SQL non garantisce l'ordinamento (ordine delle colonne) in qualsiasi momento . Davvero, in qualsiasi momento. E non c'è motivo di discuterne, è stato mostrato letteralmente migliaia di volte e su Internet.

No ORDER BY == nessuna selezione. Fine della storia.

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

Ci sono due direzioni in cui i dati possono essere ordinati da:

  • ascendente (spostandosi verso l'alto), usando ASC
  • discendente (spostandosi in basso), usando 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

Quando ordini la colonna testuale ((n) char o (n) varchar), fai attenzione che l'ordine rispetti le regole di confronto. Per ulteriori informazioni sulle regole di confronto, consultare l'argomento.

Ordinare e ordinare i dati può consumare risorse. Questo è dove gli indici creati correttamente vengono a portata di mano. Per ulteriori informazioni sugli indici, consultare l'argomento.

C'è la possibilità di pseudo-randomizzare l'ordine delle righe nel tuo gruppo di risultati. Basta forzare l'ordine ad apparire non deterministico.

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

L'ordine può essere ricordato in una stored procedure, e questo è il modo in cui dovresti farlo se è l'ultimo passo per manipolare il set di righe prima di mostrarlo all'utente finale.

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

EXEC GetSortOrder
GO

Esiste anche un supporto limitato (e hacky) per l'ordine nelle viste di SQL Server, ma si consiglia di NON utilizzarlo.

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

Per ordinare puoi utilizzare nomi di colonne, alias o numeri di colonna nel tuo 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

Vi sconsiglio di usare i numeri nel vostro codice, a meno che non vogliate dimenticarcene il momento dopo averlo eseguito.

Ordina per caso

Se vuoi ordinare i tuoi dati in ordine numerico o alfabetico, puoi semplicemente utilizzare l' order by [column] . Se si desidera ordinare utilizzando una gerarchia personalizzata, utilizzare un'istruzione case.

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

Utilizzando un order by base order by :

Select * from MyTable
Order by Group

restituisce un ordinamento alfabetico, che non è sempre auspicabile:

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

Aggiunta di un'istruzione "caso", che assegna valori numerici crescenti nell'ordine in cui si desidera ordinare i dati:

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

restituisce i dati nell'ordine specificato:

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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow