2010-12-21 10 views
15

Estoy haciendo un pequeño análisis y buscando una explicación sobre cómo el servidor SQL evalúa MIN(Varchar).SERVIDOR SQL - Entender cómo funciona MIN (texto)

me encontré con esta observación en BOL: MIN busca el valor más bajo en el orden de clasificación definido en la base de datos subyacente

Así que si tengo una tabla que tiene una fila con los siguientes valores:

Data 

AA 
AB 
AC 

Haciendo un SELECT MIN(DATA) regresaría AA. Solo quiero entender por qué detrás de esto y entender el BOL un poco mejor.

Gracias!

+0

Solo, para su información, creo que la edición de esta pregunta (aunque hace que los datos se "vean" correctos) no expresa la intención del OP que quiere todos esos valores en una fila, no en tres. –

+0

@Larry Lustig: en realidad, creo que la pregunta del OP es engañosa; Dudo que tenga una tabla con una fila y tres valores en ella; probablemente quiera una tabla con una sola columna y tres filas, cada una con uno de esos valores. ¿De qué otro modo haría un 'MIN (Datos)' en esa tabla? –

+0

No está claro, pero creo que, de hecho, cree que MIN opera en una sola fila (porque dijo "una fila"). Creo que lo está confundiendo con una función que toma varios argumentos y devuelve el más pequeño). –

Respuesta

16

Está determinado por collation (orden de clasificación). Para la mayoría de las culturas el orden de clasificación es el mismo que el orden alfabético en el alfabeto Inglés así:

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

Por lo tanto' AA 'es el valor mínimo. Para otras culturas esto puede no ser válido. Por ejemplo, una clasificación danesa devolvería 'AB' como el mínimo porque 'AA'> 'AB'. Esto se debe a que 'AA' se considera equivalente a 'Å', que es la última letra del alfabeto danés.

 
SELECT MIN(s COLLATE Danish_Norwegian_CI_AS) FROM table1; 

min_s 
AB 

para obtener una orden de clasificación "ordinario" utilizar el Latin1_General_Bin cotejo:

 
SELECT MIN(s COLLATE Latin1_General_Bin) FROM table1; 

min_s 
AA 

para reproducir este resultado puede crear esta tabla de prueba:

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

Por supuesto, los números almacenados como texto también van en orden alfabético, no en orden numérico y a menudo ocurren resultados inesperados. Por ejemplo, 110 ordenaría en frente de 2 porque alfabéticamente cualquier cosa que comience con 1 es anterior a cualquier cosa que comience con 2. – HLGEM

5

No, MIN se utiliza en una instrucción SELECT que escanea más de una línea. Toma una columna como argumento y devuelve el valor "más bajo" (nuevamente, según la secuencia de clasificación) que se encuentra en esa columna.

Utilizado sin una cláusula GROUP BY, el conjunto de resultados tendrá una sola fila, y el valor de MIN será el valor más bajo encontrado en esa columna. Usado con una cláusula GROUP BY, el conjunto de resultados tendrá una fila para cada grupo y el valor de MIN será el valor más bajo en esa columna para cualquier fila en el grupo.

+0

+1 - y 'AA' es" menor "que' AB' porque primero está alfabéticamente – JNK

2

min (x), donde es un tipo char (cadena) - char(), varchar(), nchar(), nvarchar(), encuentra el valor más bajo en el grupo, basado en las reglas de comparación de cadenas de SQL:

  • si dos cuerdas difieren en longitud, la más corta se rellena con caracteres SP (espacios) a la longitud de la más larga.
  • La comparación procede de izquierda a derecha, carácter por carácter, según la regla de la secuencia de intercalación en uso.
  • en las comparaciones, el valor NULL se compara más bajo que cualquier valor no nulo (el estándar SQL ISO/ANSI dice que es una opción de implementación si NULL se recopila más bajo o más alto que cualquier valor no nulo).

Por lo tanto, si usted tiene una mesa

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

a continuación, ejecutar la consulta

select min(myString) from foo 

le dará el mismo resultado en forma si se ejecutara

set rowcount 1 

select myString 
from foo 
order by myString 

set rowcount 0 

Usted básicamente están ordenando el conjunto en secuencia ascendente y seleccionando el primer val ue. MAX(), o curso, le da la inversa, ordenar el conjunto en secuencia descendente y seleccionar el primer valor.

+0

+1 para 'el estándar SQL ISO/ANSI dice que es una elección de immplementación si NULL compara menor o más alto que cualquier valor no nulo' –

Cuestiones relacionadas