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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/* 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!