Оператор SQL и ALL - PullRequest
       1

Оператор SQL и ALL

4 голосов
/ 11 августа 2010

В поисках элегантного способа обойти это ...

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

Проблема заключается в том, что если (SELECT ZIP FROM PEOPLE WHERE PERSONTYPE = 1) не возвращает записей, то приведенный выше IF оценивается как true,Я ищу способ сделать эту оценку ложной, если нет записей, возвращаемых подзапросом ALL.

Мое текущее решение:

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

Ответы [ 3 ]

3 голосов
/ 11 августа 2010

Использование:

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!'
2 голосов
/ 11 августа 2010

Прыжки в:

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!' 
2 голосов
/ 11 августа 2010

Рассмотрите возможность использования EXISTS.

IF @ZIP = ALL(SELECT ZIP FROM PEOPLE WHERE PERSONTYPE = 1)  
   AND EXISTS(SELECT 1 FROM PEOPLE WHERE PERSONTYPE = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...