2010-08-10 84 views
4

寻找一个优雅的方式来解决这个...SQL和ALL操作

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!' 

的问题是,如果(选择ZIP从不同人的PERSONTYPE = 1)返回任何记录,那么上面的if计算为真。我正在寻找一种方法,当ALL的子查询没有返回任何记录时,将其评估为false。

我目前的解决方案:

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服务器(T-SQL标准) – MooseCoder 2010-08-10 21:47:54

回答

2

跳跃:

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

我喜欢这个想法。让我感到困惑的是,为什么ALL关键字没有按照人们所期望的那样使用空集。有点让它在许多用例中无用。我想继续使用它来提高可读性。 – MooseCoder 2010-08-11 13:43:37

+0

在我的真实案例中实现您的代码,以便您获得支票。谢谢! – MooseCoder 2010-08-11 14:42:36

2

考虑使用中也存在。

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

看起来不错,当你的查询是一个衬垫,但是如果选择是较大的多个连接,然后没有那么多。虽然不错。 – MooseCoder 2010-08-10 21:35:25

+0

的确,在多连接的较大选择语句的情况下,我会让它成为一个CTE。 – 2010-08-10 21:40:37

3

用途:

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

我喜欢ALL关键字,它确实强调了我想要做的事情。不是一个坏主意。虽然只适用于INT。 – MooseCoder 2010-08-10 21:53:42

+0

@菲尔:好点,我们的加拿大邮政编码不能很好地与最小/最大... – 2010-08-10 22:12:12