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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top