Compartilhar via


Entendendo os operadores SOME, ANY e ALL

Introdução

Este artigo fornece uma demonstração sobre como funciona os operadores de comparação: SOME, ANY e ALL.

As consultas e subconsultas que utilizam estes operadores de comparação SQL-ISO (padrão), retornam valores numéricos maior ou igual à zero para diversas funcionalidades, como cláusulas GROUP BY, HAVING ou subconsultas declaradas com EXISTS.

O objetivo é facilitar a execução sobre a comparação de um ou mais registros, através de valores escalares, que atendam à uma condição booleana.

O conteúdo é parte das habilidades avaliadas no exame 94-364: MTA Database Fundamentals.

 

Construindo Ambiente para Teste

Para apresentar como funciona cada operador, é necessário uma tabela onde possamos obter dados númericos diretamente por uma coluna ou através de um resultado de agrupamento COUNT, SUM ou AVG.

Segue abaixo o script T-SQL para criação de uma tabela simples para esta demonstração:


CREATE TABLE TB_TEST (
       ID_CLIENT smallint IDENTITY(1,1) NOT NULL,
       NM_CLIENT varchar(20) NOT NULL
) ON [PRIMARY]
GO

INSERT INTO TB_TEST VALUES ('CLIENT 1');
INSERT INTO TB_TEST VALUES ('CLIENT 2');
INSERT INTO TB_TEST VALUES ('CLIENT 3');
GO

SELECT * FROM TB_TEST;
GO


Veja abaixo a imagem desta tabela disponibilizada:

Operadores "SOME" e "ANY"

Os operadores SOME e ANY são semelhantes e lembram "um pouco" a instrução "IN", mas retornam um valor booleano "True" ou "False". Os valores para comparação sempre devem ser baseados em uma única coluna.

Ao menos um dos valores deve atender a condição indicada.

Segue abaixo um script SQL demonstrando o funcionamento destes operadores:


DECLARE @VALOR int = 3

--É "Menor" que "Algum" dos números desta coluna
SELECT IIF((@VALOR < SOME (SELECT ID_CLIENT FROM TB_TEST)), 'É', 'NÃO É')

--É "Diferente" que "Algum" dos números desta coluna
SELECT IIF((@VALOR <> SOME (SELECT ID_CLIENT FROM TB_TEST)), 'É diferente', 'É igual')

--É "Menor" que "Qualquer" dos números desta coluna
SELECT IIF((@VALOR < ANY (SELECT ID_CLIENT FROM TB_TEST)), 'É', 'NÃO É')

--É "Diferente" que "Qualquer" dos números desta coluna
SELECT IIF((@VALOR <> ANY (SELECT ID_CLIENT FROM TB_TEST)), 'É diferente', 'É igual')
GO


Veja abaixo a imagem com os resultados comparativos entre SOME e ANY, baseados na variável @VALOR =3

https://social.technet.microsoft.com/Forums/getfile/661628

Veja abaixo a imagem com os resultados comparativos entre SOME e ANY, agora com base na variável @VALOR =2
https://social.technet.microsoft.com/Forums/getfile/661629

Operador "ALL"

Utilizando o oeprador "ALL", deverá ser verificado se o valor está entre um dos registros armazenados na coluna indicada.

Também possui um retorno booleano, semelhante à SOME e ANY, porém neste caso somente retornará o resultado "True" quando encontrar ao menos um valor comparado entre o conjunto de uma coluna.

Você pode obter os mesmos resultados com o operador "<> ALL" semelhante à cláusula "NOT IN".

Segue abaixo um script SQL demonstrando o funcionamento destes operadores:


DECLARE @VALOR int = 1

--É "Menor" que "Todos" os números desta coluna
SELECT IIF((@VALOR < ALL (SELECT ID_CLIENT FROM TB_TEST)), 'É', 'NÃO É')

--É "Diferente" que "Todos" os números desta coluna
SELECT IIF((@VALOR <> ALL (SELECT ID_CLIENT FROM TB_TEST)), 'Sim. É diferente', 'Não. É igual')
GO


Veja abaixo a imagem com os resultados comparativos do operador ALL baseado na variável @VALOR =1

https://social.technet.microsoft.com/Forums/getfile/661676

Veja abaixo a imagem com os resultados comparativos do operador ALL baseado na variável @VALOR = 0: 

https://social.technet.microsoft.com/Forums/getfile/661677


Referências

Veja Também