2010-08-10 6 views
4

Vous cherchez une façon élégante de contourner ce ...SQL et ALL opérateur

DECLARE @ZIP INT 
SET @ZIP = 55555 

IF @ZIP = ALL(SELECT ZIP FROM PEOPLE WHERE PERSONTYPE = 1) 
    PRINT 'All people of type 1 have the same zip!' 
ELSE 
    PRINT 'Not All people of type 1 have the same zip!' 

Le problème est que, si (SELECT postal DE PERSONNES OU PersonType = 1) ne renvoie aucun enregistrement, alors ce qui précède IF evalue à vrai. Je cherche un moyen de rendre cette évaluation à false quand il n'y a pas d'enregistrements retournés par la sous-requête ALL.

Ma solution actuelle:

DECLARE @ZIP INT 
SET @ZIP = 55555 

DECLARE @ALLZIPS TABLE (INT ZIP) 

INSERT INTO @ALLZIPS 
SELECT ZIP FROM PEOPLE WHERE PERSONTYPE = 1 

IF EXISTS(SELECT TOP 1 * FROM @ALLZIPS) AND (@ZIP = ALL (SELECT ZIP FROM @ALLZIPS)) 
    PRINT 'All people of type 1 have the same zip!' 
ELSE 
    PRINT 'Not All people of type 1 have the same zip!' 
+0

MS SQL Server (norme T-SQL) – MooseCoder

Répondre

2

Sauter dans:

IF (SELECT SUM(CASE WHEN ZIP = @ZIP THEN 0 ELSE 1 END) 
    FROM PEOPLE WHERE PERSONTYPE = 1) = 0 
    PRINT 'All people of type 1 have the same zip!' 
ELSE 
    PRINT 'Not All people of type 1 have the same zip!' 
+0

J'aime l'idée. Ce qui me dérange, c'est que le mot-clé ALL ne fonctionne pas comme on pourrait s'y attendre avec un ensemble vide. Kinda le rend inutile pour de nombreux cas d'utilisation. Je voudrais continuer à l'utiliser pour la lisibilité. – MooseCoder

+0

Implémenter votre code dans mon cas réel afin que vous obteniez le chèque. Merci! – MooseCoder

2

Pensez à utiliser EXISTE ainsi.

IF @ZIP = ALL(SELECT ZIP FROM PEOPLE WHERE PERSONTYPE = 1) 
    AND EXISTS(SELECT 1 FROM PEOPLE WHERE PERSONTYPE = 1) 
+0

semble bon lorsque votre requête est une doublure, si la sélection est plus grand avec des jointures multiples, alors pas tellement. Pas mal cependant. – MooseCoder

+0

En effet, dans le cas d'une instruction select plus grande avec des jointures multiples, j'en ferais un CTE. –

3

Utilisation:

IF EXISTS(SELECT NULL 
      FROM PEOPLE p 
      WHERE p.persontype = 1 
      HAVING MIN(p.zip) = @Zip 
      AND MAX(p.zip) = @Zip) 
    PRINT 'All people of type 1 have the same zip!' 
ELSE 
    PRINT 'Not All people of type 1 have the same zip!' 
+0

J'aime le mot-clé ALL, il souligne vraiment ce que je suis en train de faire. Pas une mauvaise idée. Fonctionne seulement avec INT si. – MooseCoder

+0

@Phil: Bon point, nos codes postaux canadiens ne fonctionneraient pas bien avec MIN/MAX ... –