SQL SERVER - how (testo) opere MIN Comprendere
-
12-10-2019 - |
Domanda
che sto facendo un po 'di scavo e alla ricerca di una spiegazione su come SQL Server valuta MIN(Varchar)
.
Ho trovato questa osservazione di BOL: MIN trova il valore più basso nella sequenza di collazione definito nel database sottostante
Quindi, se ho una tabella che ha una riga con i seguenti valori:
Data
AA
AB
AC
Facendo un SELECT MIN(DATA)
sarebbe tornato indietro AA. Voglio solo capire il motivo per cui alla base di questo e capire il BOL un po 'meglio.
Grazie!
Soluzione
E 'determinata dalla collazione ( ordinamento). Per la maggior parte delle culture l'ordine di collazione è lo stesso che l'ordine alfabetico in alfabeto inglese in modo:
- 'AA' < 'AB'
- 'AA' < 'AC'
- 'AB' < 'AC'
Pertanto 'AA' è il valore minimo. Per altre culture questo non può tenere. Ad esempio un confronto danese ritornerebbe 'AB' come il minimo perché 'AA'> 'AB'. Questo perché 'AA' è considerato equivalente al 'Å' che è l'ultima lettera dell'alfabeto danese.
SELECT MIN(s COLLATE Danish_Norwegian_CI_AS) FROM table1; min_s AB
Per ottenere un uso "normale" ordinamento il confronto Latin1_General_Bin
:
SELECT MIN(s COLLATE Latin1_General_Bin) FROM table1; min_s AA
Per riprodurre questo risultato è possibile creare questa tabella di test:
CREATE TABLE table1 (s varchar(100)); INSERT INTO table1 (s) VALUES ('AA'), ('AB'), ('AC');
Altri suggerimenti
No, MIN viene utilizzato in un'istruzione SELECT che le scansioni più di una riga. Ci vuole una colonna come argomento, e restituisce il valore "basso" (ancora una volta, a seconda della sequenza di confronto) in quella colonna.
Utilizzato senza una clausola GROUP BY, l'insieme dei risultati avrà una singola riga, e il valore di MIN sarà il valore più basso si trovano in quella colonna. Utilizzato con una clausola GROUP BY, il set di risultati avrà una riga per ogni gruppo e il valore di MIN sarà il valore più basso in quella colonna per qualsiasi riga del gruppo.
min (x), dove si trova un char (stringa) Tipo - char (), varchar (), nchar (), nvarchar (), trova il valore più basso nel gruppo, sulla base di regole di confronto stringa di SQL:
- se due stringhe si differenziano per la lunghezza, la più corta è imbottito con i caratteri (spazi SP) alla lunghezza del più lungo.
- procede confronto da sinistra a destra, carattere per carattere, secondo la regola della sequenza di confronto in uso.
- in confronto, il valore NULL confronta inferiore a qualsiasi valori non nulli (lo standard ISO / ANSI SQL dice che è una scelta implementazione sul fatto che raccoglie NULL inferiore o superiore rispetto a qualsiasi valore non nullo).
Quindi, se si dispone di una tabella
create table foo
(
myString varchar(16) not null ,
)
quindi di eseguire la query
select min(myString) from foo
vi darà lo stesso set di risultati come se si eseguisse
set rowcount 1
select myString
from foo
order by myString
set rowcount 0
sono fondamentalmente ordinando il set in sequenza ascendente e selezionando il primo valore. MAX (), o corso, si dà l'inverso, ordinando il set in sequenza discendente e selezionando il primo valore.