2010-08-10 62 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