Olhando os operadores lógicos do SQL Server (link), me deparei com algo curioso, que até então não tinha visto: os operadores Some, Any e All que, vejam só, está disponível desde do SQL Server 2008. #facepalm
O objetivo deles: Comparar um valor escalar (lembrem-se disso) com os valores de um dataset (a.k.a. subquery). O ALL validará se TODOS os valores do dataset correspondem ao valor comparado. O SOME e o ANY são equivalentes, eles retornaram TRUE se algum dos valores do dataset corresponder à comparação.
Se você ouviu um IN na explicação, pense nele como um IN com esteroides para um valor escalar, uma vez que você pode validar com os operadores =, <, >, <>, etc.
Exemplo:
CREATE TABLE Pessoas (Codigo int IDENTITY(1,1) NOT NULL, Nome varchar(20), Nascimento date)
GO
ALTER TABLE dbo.Pessoas ADD CONSTRAINT PK_Pessoas PRIMARY KEY CLUSTERED (Codigo) ON [PRIMARY]
GO
CREATE TABLE Produtos (Codigo int IDENTITY(1,1) NOT NULL, Nome varchar(50), Preco decimal(11,2))
GO
ALTER TABLE dbo.Produtos ADD CONSTRAINT PK_Produtos PRIMARY KEY CLUSTERED (Codigo) ON [PRIMARY]
GO
CREATE TABLE Compras (Codigo int IDENTITY(1,1) NOT NULL, PESCodigo int, PROCodigo int, DtCompra date, Quantidade smallint, Total decimal(11,2))
GO
ALTER TABLE dbo.Compras ADD CONSTRAINT PK_Compras PRIMARY KEY CLUSTERED (Codigo) ON [PRIMARY]
GO
ALTER TABLE dbo.Compras ADD CONSTRAINT FK_Pessoas_Compras FOREIGN KEY (PESCodigo) REFERENCES dbo.Pessoas (Codigo)
GO
ALTER TABLE dbo.Compras ADD CONSTRAINT FK_Produtos_Compras FOREIGN KEY (PROCodigo) REFERENCES dbo.Produtos (Codigo)
GO
INSERT INTO PESSOAS VALUES
('Luke', '1981-05-25'),('Vader', '1980-07-14'),('Yoda', '1985-05-30'),('Qui Gon Jin', '1960-12-25'),('Obi-Wan', '1960-12-25')
GO
INSERT INTO Produtos VALUES
('Natural Lightsaber Crystal', 2000), ('Synthetic Lightsaber Crystal',2500)
GO
INSERT INTO Compras VALUES
(1,1,'2015-05-01',2,4000), (1,2,'2015-06-01',1,2500), -- Luke
(2,2,'2015-07-01',10,20000), -- Vader
(3,1,'2015-06-01',2,5000), -- Yoda
(4,1,'2015-04-01',1,2000), -- Qui Gon Jin
(5,2,'2015-05-01',3,7500) --Obi-Wan
GO/*
Casos de uso
*/
-- SOME
IF 'Vader' = SOME (
SELECT P.Nome
FROM Pessoas P
JOIN Compras C
ON C.PESCodigo = P.Codigo
WHERE C.DtCompra BETWEEN '2015-07-01' AND '2015-07-31'
)
PRINT 'Looks like the Empire is getting ready to attack this month'
ELSE
PRINT 'The Empire is just planning the attack this month'
-- ALL
IF 2 <= ALL (
SELECT c.Quantidade
FROM Compras C
WHERE C.DtCompra BETWEEN '2015-05-01' AND '2015-05-31'
)
PRINT 'Everybody bought more than one crystal on May 2015'
ELSE
PRINT 'Someone bought just one crystal on May 2015'Importante:
Cuidado com os tipos de dados comparados, para não ter um erro de conversão no hora da execução.
[]’s!