2009-10-15 12 views
5

¿Hay alguna diferencia en el orden de v1 y v2 en una consulta BETWEEN en SQL Server?sql: BETWEEN v1 AND v2

SELECT * 
    FROM table 
WHERE col BETWEEN v1 AND v2 

Actualmente no obtengo ningún resultado si v1 es más grande que v2. ¿Es esto solo azúcar sintáctico para

col >= v1 AND col <= v2 

o realmente toma todos los valores entre los dos? en mis observaciones actuales, supongo que es el primer caso.

Respuesta

11

SQL Server 2008:

select 1 
where 5 between 1 and 7 

1 resultado

select 1 
where 5 between 7 and 1 

0 resultados

Sobre la base de estos resultados, y la Postgre Docs Me planteo la hipótesis de que la Norma ANSI es el siguiente (aunque No puedo encontrar ese documento).

a between x and y 
== 
a >= x AND a <= y 

ACTUALIZACIÓN:

La especificación SQL-92 dice (cita):

"X BETWEEN Y AND Z" is equivalent to "X>=Y AND X<=Z" 
+0

Y revisa "seleccionar 1 donde 7 entre 7 y 1" - ¡increíble! –

+0

los ejemplos no son sintácticamente válidos en MySQL –

+0

(debe insertar 'from dual' para que funcionen) –

11

Sí! El orden de los argumentos en el asunto del predicado BETWEEN. Y, sí, este es [principalmente] azúcar sintáctico para la forma de comparación AND-ed.

La "mayoría", por encima proviene del hecho de que mientras lógicamente equivalente, las dos expresiones pueden (probablemente en el pasado ...) recibir un plan de consulta distinta en algunos servidores SQL. Es una suposición segura que la mayoría de los servidores, hoy en día, ofrecen un manejo óptimo de este tipo de filtro, independientemente de su forma.

3

Sí, tienes razón, ¿es solo azúcar sintáctico para la construcción que mencionaste?