Question

Je fais un peu de creuser et à la recherche d'une explication sur la façon dont SQL Server évalue MIN(Varchar).

I trouvé dans cette remarque BOL: MIN recherche la valeur la plus faible dans l'ordre de classement défini dans la base de données sous-jacente

Donc, si j'ai une table qui a une ligne avec les valeurs suivantes:

Data

AA
AB
AC

Faire un SELECT MIN(DATA) serait revenir AA. Je veux juste comprendre le pourquoi cela et comprendre le BOL un peu mieux.

Merci!

Était-ce utile?

La solution

Il est déterminé par le collation ( ordre de tri). Pour la plupart des cultures de l'ordre de classement est le même que l'ordre alphabétique dans l'alphabet anglais, donc:

  • 'AA' < 'AB'
  • 'AA' < 'AC'
  • 'AB' < 'AC'

Par conséquent, « AA » est la valeur minimale. Pour les autres cultures, cela ne peut pas tenir. Par exemple, une collation danoise retournerait « AB » comme le minimum parce que « AA »> « AB ». En effet, « AA » est considéré comme équivalent à « A » qui est la dernière lettre de l'alphabet danois.

SELECT MIN(s COLLATE Danish_Norwegian_CI_AS) FROM table1;

min_s
AB

Pour obtenir une utilisation de l'ordre de tri « ordinaire » du classement Latin1_General_Bin:

SELECT MIN(s COLLATE Latin1_General_Bin) FROM table1;

min_s
AA

Pour reproduire ce résultat, vous pouvez créer cette table de test:

CREATE TABLE table1 (s varchar(100));
INSERT INTO table1 (s) VALUES ('AA'), ('AB'), ('AC');

Autres conseils

Non, MIN est utilisé dans une instruction SELECT scans plus d'une ligne. Il faut une colonne comme un argument, et retourne la valeur « bas » (encore une fois, selon la séquence de classement) trouvée dans cette colonne.

Utilisé sans clause GROUP BY, le jeu de résultats aura une seule ligne, et la valeur de MIN sera la valeur la plus basse trouvée dans cette colonne. Utilisé avec une clause GROUP BY, le jeu de résultats aura une ligne pour chaque groupe et la valeur de MIN est la valeur la plus faible dans cette colonne pour chaque ligne du groupe.

min (x), où est un char (string) - type char (), varchar (), nchar (), nvarchar (), trouve la valeur la plus faible dans le groupe, sur la base des règles de comparaison de chaîne de SQL:

  • si deux chaînes diffèrent en longueur, la plus courte est rembourré avec des caractères SP (espaces) à la longueur de la plus longue.
  • produit de comparaison de gauche à droite, caractère par caractère, selon la règle de la séquence de classement utilisée.
  • dans les comparaisons, la valeur NULL compare inférieure à toutes les valeurs non nulles (la norme ISO / ANSI SQL dit que c'est un choix de mise en œuvre de savoir si assemble NULL inférieure ou supérieure à une valeur non nulle).

Donc, si vous avez une table

create table foo
(
  myString varchar(16) not null ,
)

puis exécuter la requête

select min(myString) from foo

vous donnera le même jeu de résultat que si vous avez exécuté

set rowcount 1

select myString
from foo
order by myString

set rowcount 0

Vous commandez essentiellement l'ensemble dans l'ordre croissant et en sélectionnant la première valeur. MAX (), ou bien sûr, vous donne l'inverse, la commande de l'ensemble dans l'ordre décroissant et en sélectionnant la première valeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top