El operador ANY ( o SOME) permite comparar una expresión (=, <, >, >=, <=, <>) contra una lista de valores. Regresa verdadero si la expresión buscada resulta verdadera al comparar contra la lista de valores proporcionada.
En general, el uso del operador ANY es como sigue
expresión-buscada Operador-de-comparación ANY (lista de valores)
La lista de valores debe ser un conjunto multilínea de datos, pero de una sola columna.
Ejemplo de ANY
Un ejemplo del uso del operador ANY (o SOME) es como sigue
SELECT * FROM tabla
WHERE campo > ANY (SELECT otroCampo FROM otraTabla);
Equivalencia con el operador IN
Cuando el operador de comparación es un igual (=) entonces la expresión completa tiene su equivalente con el operador lógico IN. De esa manera
campo = ANY (valores)
es equivalente a campo IN (lista de valores)
Uso del operador ANY
La lista de valores que utiliza ANY debe ser una subconsulta y no una lista de valores fijos (como se podía usar en el operador IN), de tal manera que se evalúa el query que estará dentro de los paréntesis y después se compara con el valor a buscar. La ventaja del operador ANY es que la comparación se hace utilizando un operador adicional (=, <, <=, >=, > o <>) de tal manera que regresará si el valor a comparar cumple -al menos con uno de los valores- con el operador involucrado.
En términos generales, el uso de ANY con una subconsulta es similar a
valor-a-buscar operdor ANY (SELECT campo FROM tabla)
En este caso, se ejecuta el query dentro de los paréntesis (con la única restricción de que tiene que ser un query que regrese solo una columna) y después se evalúa si el valor-a-buscar
cumple, al menos una vez, con cualquiera de los valores de la lista (de acuerdo al operador utilizado).
Es decir,
valor-a-buscar = ANY (SELECT campo FROM tabla)
regresa verdadero si el valor-a-buscar es igual a cualquiera de los valores de la subconsulta (al menos uno).valor-a-buscar > ANY (SELECT campo FROM tabla)
regresa verdadero si el valor-a-buscar es mayor a cualquiera de los valores de la subconsulta (al menos uno).valor-a-buscar <= ANY (SELECT campo FROM tabla)
regresa verdadero si el valor-a-buscar es menor, o igual, aalmenos uno de los valores de la subconsulta.
Ejemplo de operador IN utilizando subconsultas
SELECT id, nombre, domicilio, saldo FROM clientes
WHERE
edad > ANY (SELECT TOP 10 edad FROM poblacion)
Este query obtiene los clientes cuya edad sea superior a cualquiera de los 10 registros con más edad ade la tabla de población; es decir, para cada registro se obtiene, en el subquery, la lista de las 10 personas con más edad y luego se compara la edad de la tabla de clientes, si resulta que la edad del cliente es mayor a cualquiera de las 10 obtenidas en el subquery, entonces el registro se regresa como resultado.
Consideraciones de performance con el operador ANY
Si bien el utilizar este operador es una forma cómoda y clara de escribir una consulta, se tiene que considerar que el cálculo y obtención del subquery se hace cada vez que se evalúa el query principal, es decir, una vez por cada registro.
Esto, dependiendo del tamaño de las tablas involucradas, puede traer una sobrecarga del performance del query globalmente.