2010-08-10 9 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!' 

Вопрос заключается в том, что, если (SELECT ZIP FROM НАРОДА WHERE PERSONTYPE = 1) не возвращает никаких записей, то выше IF Равняется к истине. Я ищу способ сделать это оценивать как false, когда нет записей, возвращаемых подзапросом 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!' 
+0

MS SQL Server (T-SQL стандарт) – MooseCoder

ответ

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 не работает, как можно было бы ожидать с пустым набором. Kinda делает его бесполезным для многих случаев использования. Я бы хотел использовать его для удобочитаемости. – MooseCoder

+0

Реализовал свой код в моем реальном мире, чтобы получить чек. Благодаря! – MooseCoder

2

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

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

выглядит хорошо, когда ваш запрос является один лайнер, однако если выбрать это больше с несколькими объединениями, то не так много. Неплохо. – MooseCoder

+0

Действительно, в случае более крупного оператора select с несколькими объединениями я бы сделал его CTE. –

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

+0

@Phil: Хорошая точка, наши канадские почтовые коды не будут работать с MIN/MAX ... –